在c#中只读一个列表

我有这个示例代码。 我想要做的是使“Nums”值只能使用“AddNum”方法写入。

namespace ConsoleApplication1 { public class Person { string myName = "N/A"; int myAge = 0; List _nums = new List(); public List Nums { get { return _nums; } } public void AddNum(int NumToAdd) { _nums.Add(NumToAdd); } public string Name { get; set; } public int Age { get; set; } } } 

不知怎的,我已经尝试了一些关于AsReadOnly()和readonly关键字的东西,但我似乎无法让它做我想做的事情。

这是我必须访问该属性的代码示例。

 Person p1 = new Person(); p1.Nums.Add(25); //access 1 p1.AddNum(37); //access 2 Console.WriteLine("press any key"); Console.ReadLine(); 

我真的希望“访问1”失败,“访问2”是唯一可以设置值的方式。 在此先感谢您的帮助。

√请使用ReadOnlyCollection,ReadOnlyCollection的子类,或者在极少数情况下使用IEnumerable作为属性或返回表示只读集合的​​值。

本文的引用。

你应该有这样的事情:

 List _nums = new List(); public ReadOnlyCollection Nums { get { return _nums.AsReadOnly(); } } 

通常,集合类型会产生较差的属性,因为即使集合包装在ReadOnlyCollection ,它本身也不清楚:

 IEnumerable nums = myPerson.Nums; myPerson.AddNum(23); foreach(int i in nums) // Should the 23 be included!? ... 

应该是的意思。 从Nums返回的对象是否为其调用时存在的数字的快照,是实时视图吗?

GetNumsAsArray方法是使用一个名为GetNumsAsArray的方法,每次调用时都返回一个新数组; 在某些情况下,根据调用者想要对数字做什么,有一个GetNumsAsList变体也可能会有所帮助。 有些方法只能用于数组,有些只能用于列表,所以如果只提供上面的一个,一些调用者必须调用它然后将返回的对象转换为所需的类型。

如果性能敏感的调用者需要经常使用此代码,那么使用更通用的方法可能会有所帮助:

 int CopyNumsIntoArray(int sourceIndex, int reqCount, ref int[] dest, int destIndex, CopyCountMode mode); 

其中CopyCountMode指示代码应该执行的操作,从sourceIndex开始的可用项数大于或小于reqCount ; 该方法应该返回可用的项目数,或者如果它违反了调用者声明的期望则抛出exception。 一些调用者可能从创建并传入一个10项数组开始,但是如果要返回的项目超过十个,则准备让该方法用更大的数组替换它; 其他人可能会期望将会有23个项目并且没有准备好处理任何其他数字。 使用参数指定模式将允许一种方法为多种呼叫者提供服务。

尽管许多集合作者并不打算包括任何符合上述模式的方法,但是这些方法可以极大地提高代码想要处理大量集合的情况下的效率(例如,50,000个集合中的1,000个项目)。 在没有这种方法的情况下,希望使用这种范围的代码必须要求提供整个事物的副本(非常浪费)或单独请求数千个项目(也浪费)。 允许调用者提供目标数组将在相同方法进行许多查询的情况下提高效率,特别是如果目标数组足够大以放在大对象堆上。