c# – 如何更改类外私有只读数组中的值?
发布时间:2020-12-15 23:41:31 所属栏目:百科 来源:网络整理
导读:请参阅以下代码: public class Program{ private static void Main() { var c = new MonthClass(); string[] months = (string[])c.GetMonths(); months[0] = "Thursday"; var d = c.GetMonths(); Console.WriteLine(d.First()); }}public class MonthClass
请参阅以下代码:
public class Program { private static void Main() { var c = new MonthClass(); string[] months = (string[])c.GetMonths(); months[0] = "Thursday"; var d = c.GetMonths(); Console.WriteLine(d.First()); } } public class MonthClass { private readonly string[] _months = { "January","February","March","April","May","June","July","August","September","October","November","December" }; public IEnumerable<string> GetMonths() => _months; } 请注意,MonthClass._months是私有且只读.但是,对GetMonths的第二次调用将星期四作为数组的第一个元素而不是1月返回. 我如何能够在MonthClass之外更改私有只读成员的值,如何防止这种情况? 在阅读答案并进行自己的研究之后.我相信以下内容将解决这个问题: private readonly string[] _months = { "January","December" }; public IEnumerable<string> GetMonths { get { foreach (var month in _months) yield return month; } } 解决方法
GetMonths()返回对数组的引用.任何具有返回值的人都有对数组的引用,并且可以更改它.
那么,如果您发生了对从该公共方法返回的数组的私有引用,该怎么办? public方法返回对该对象的引用. readonly适用于引用,而不适用于对象本身. 此代码功能相同: public class C { private readonly string[] _array = new [] { "foo" }; public string[] GetArray() => _array; } public class D { public static void Test() { C c = new C(); c.GetArray()[0] = "bar"; } } 以下是修复方法: public ReadOnlyCollection<String> GetMonths() { return Array.AsReadOnly(_months); } 这将返回一个不同的实际对象,一个实际上禁止写作的对象 – 您也可以返回ReadOnlyCollection而不是IEnumerable,因为您返回的实际对象是可索引的. 如果要返回一个可变的对象,但不允许任何人更改私有_months字段,则可以: public List<string> GetMonths() => _months.ToList(); 这样做: var mutableMonths = c.GetMonths().ToList(); 我恳请你不要将属性命名为“Get”,而不是从属性返回一个新对象.这是方法的合适案例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |