通过阅读关于另一个用户制作的收藏集上的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
答案 0 :(得分:0)
狗是class
,因此它是Reference Type
C#中有两种类型:引用类型和值类型。引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。对于引用类型,两个变量可以引用相同的对象。因此,对一个变量的操作会影响另一变量引用的对象。对于值类型,每个变量都有其自己的数据副本,并且对一个变量的操作不可能影响另一个变量(除非in,ref和out参数变量;请参阅in,ref和out参数修饰符)。
正在yield
的对象引用私有List
属性中的完全相同的对象。
答案 1 :(得分:0)
CreationDateTime
的值更改。
在值更改之前第一次打印“ Print
无限循环”。
退出循环时,它开始一个新循环,与此同时Task
将新元素添加到狗列表中。
“ Print
无限循环”重新启动循环,重新打印CreationDateTime
中值已更改的元素,并打印在第一个循环之后添加的新狗。
依此类推...