为什么属性编辑值仍然存在?

时间:2019-06-17 15:19:38

标签: c# multithreading concurrency

通过阅读关于另一个用户制作的收藏集上的concurrency的问题,我开始尝试编写自己的threadsafe list class

这样做之后,我做了一个测试用例,由于原来的foreach方法是:

GetEnumerator

我以这种方式再次写了(通过阅读互联网上的一些技巧),并且有效。我坚信它只是返回public IEnumerator<T> GetEnumerator() { lock (Lock) { return List.GetEnumerator(); } } 的副本:

original collection's enumerator

然后出于好奇,我尝试编辑给定public IEnumerator<T> GetEnumerator() { lock (Lock) { using (IEnumerator<T> enumeratorCopy = List.GetEnumerator()) { while (enumeratorCopy.MoveNext()) { yield return enumeratorCopy.Current; } } } } 的属性,但我发现编辑后的值仍然存在。

你能解释一下为什么吗? class给出的是yield而不是reference吗?

这是完整的代码:

value

2 个答案:

答案 0 :(得分:0)

狗是class,因此它是Reference Type

  

C#中有两种类型:引用类型和值类型。引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。对于引用类型,两个变量可以引用相同的对象。因此,对一个变量的操作会影响另一变量引用的对象。对于值类型,每个变量都有其自己的数据副本,并且对一个变量的操作不可能影响另一个变量(除非in,ref和out参数变量;请参阅in,ref和out参数修饰符)。

正在yield的对象引用私有List属性中的完全相同的对象。

答案 1 :(得分:0)

CreationDateTime的值更改。

在值更改之前第一次打印“ Print无限循环”。

退出循环时,它开始一个新循环,与此同时Task将新元素添加到狗列表中。

Print无限循环”重新启动循环,重新打印CreationDateTime中值已更改的元素,并打印在第一个循环之后添加的新狗。

依此类推...