Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用c语言制作一个只读列表#_C#_List_Class_Readonly Collection - Fatal编程技术网

C# 用c语言制作一个只读列表#

C# 用c语言制作一个只读列表#,c#,list,class,readonly-collection,C#,List,Class,Readonly Collection,我有这个示例代码。我想做的是使“Nums”值只能使用“AddNum”方法写入 我真的希望“访问1”失败,而“访问2”是设置值的唯一方法。提前谢谢你的帮助 √ 请使用ReadOnlyCollection,ReadOnlyCollection的子类, 或者在极少数情况下,属性或返回值为IEnumerable 表示只读集合 引用自 你应该有这样的东西: List<int> _nums = new List<int>(); public ReadOnlyCollection&l

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

我真的希望“访问1”失败,而“访问2”是设置值的唯一方法。提前谢谢你的帮助

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

引用自

你应该有这样的东西:

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

public ReadOnlyCollection<int> Nums
{
    get
    {
        return _nums.AsReadOnly();
    }
}
List_nums=newlist();
公共只读集合Nums
{
得到
{
返回_nums.AsReadOnly();
}
}

一般来说,集合类型的属性很差,因为即使将集合包装在
ReadOnlyCollection
中,也不清楚以下内容:

IEnumerable<int> nums = myPerson.Nums;
myPerson.AddNum(23);
foreach(int i in nums) // Should the 23 be included!?
  ...
其中CopyCountMode指示代码应执行的操作,从
sourceIndex
开始的可用项目数大于或小于
reqCount
;该方法应该返回可用项的数量,或者在违反调用方声明的期望时抛出异常。一些调用者可能首先创建并传入一个10项数组,但如果要返回的项超过10项,则准备让该方法将其替换为一个更大的数组;其他人可能会预计,将有整整23个项目,并没有准备好处理任何其他数字。使用参数指定模式将允许一个方法为多种调用者提供服务


尽管许多集合作者并不费心包括任何符合上述模式的方法,但如果代码希望处理集合中的少数项(例如,50000个集合中的1000个项),这些方法可以极大地提高效率。如果没有这样的方法,希望使用这样一个范围的代码必须要么请求整个内容的副本(非常浪费),要么单独请求数千项(也很浪费)。允许调用者提供目标数组将提高同一方法进行多次查询时的效率,特别是当目标数组足够大,可以放在大型对象堆上时。

您在自己的标记中指向了它:用于属性,或者只是在其中复制列表(这样,用户可以更改其副本,但不能更改您的内部状态)尝试将Nums设置为返回数组而不是列表的函数。请使用“private List Nums”而不是public List Nums。我认为您不能。但您可以删除属性“Nums”并提供一些从外部访问它的方法。嘿,supercat,我遵循了你所说的大约40%。。当我运行你在我的示例中给出的代码时:IEnumerable nums=myPerson.nums;myPerson.AddNum(23);foreach(int I in nums)//应该包括23吗!?…应该包括23吗?你是说不应该包括23吗?还是这对我来说是个问题?@stumped221:有些人只看调用代码(但看不到
Nums
的实现)一个好的API应该——在可能的范围内——被编写出来,这样只看调用代码的人就能够合理地猜测它的意思,但是一个
Nums
属性的行为不会让大部分人感到惊讶人们都在看客户端代码。相比之下,如果代码调用
getNumSarray
,任何看到方法调用的人都会希望它得到一个快照。Hmmm..你能给我一个场景的例子,在这个场景中,有人实例化一个对象,显式地为该对象的属性赋值或插入一个值,然后不期望或不想要该值吗e他们只是添加了显示在该对象实例中的内容?我对OOP世界有点陌生,所以我真的只是教育性地问一下。@stumped221:问题是调用方是否希望
Nums
是接收对象的实时视图,还是表示从中分离出来的快照de>string foo=myControl.Text;myControl.Text+=“*”人们不希望第二条语句在
foo
中添加星号,因为
foo
表示控件在调用时所包含的
Text
属性的快照。@stumped221:假设代码允许用户编辑数字列表,但提供了一个恢复更改的选项。一种方法要做到这一点,需要在进行更改之前捕获列表的快照,并在用户选择“还原”时从快照恢复列表的状态。但是,如果本来应该是快照的内容实际上是一个实时视图,那么这将不起作用。有时调用者需要快照。偶尔他们可能需要一个实时视图。大多数时候,调用者实际上对其中任何一个都没问题,但他们获得的内容的性质仍应记录在案。
List<int> _nums = new List<int>();

public ReadOnlyCollection<int> Nums
{
    get
    {
        return _nums.AsReadOnly();
    }
}
IEnumerable<int> nums = myPerson.Nums;
myPerson.AddNum(23);
foreach(int i in nums) // Should the 23 be included!?
  ...
int CopyNumsIntoArray(int sourceIndex, int reqCount, ref int[] dest, 
                      int destIndex, CopyCountMode mode);