在c#中只读一个列表

时间:2015-03-18 17:10:05

标签: c# list class readonly-collection

我有这个示例代码。我想做的是让它成为" Nums"值只能使用" AddNum"写入方法

namespace ConsoleApplication1
{
    public class Person
    {
        string myName = "N/A";
        int myAge = 0;
        List<int> _nums = new List<int>();

        public List<int> 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();

我真的想&#34;访问1&#34;失败,并且&#34;访问2&#34;成为可以设置值的 ONLY 方式。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

  

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

this article的引用。

你应该有这样的东西:

List<int> _nums = new List<int>();

public ReadOnlyCollection<int> Nums
{
    get
    {
        return _nums.AsReadOnly();
    }
}

答案 1 :(得分:2)

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

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

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

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

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

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

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

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