Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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#_Multithreading_Unit Testing_Tdd_Thread Safety - Fatal编程技术网

C# 如何为线程不安全集合编写单元测试

C# 如何为线程不安全集合编写单元测试,c#,multithreading,unit-testing,tdd,thread-safety,C#,Multithreading,Unit Testing,Tdd,Thread Safety,我正在使用TDD方法编写一个双链接列表。此集合类型不是线程安全的。为了实现ICollection接口,我的list类必须有几个公共属性(包括IsSynchronized和SyncRoot,它们用于提供线程安全的收集方式)。 这两个属性的代码非常简单: public bool IsSynchronized { get { return false; } } private readonly object _syncRoot = new object(); public object SyncRo

我正在使用TDD方法编写一个双链接列表。此集合类型不是线程安全的。为了实现ICollection接口,我的list类必须有几个公共属性(包括IsSynchronized和SyncRoot,它们用于提供线程安全的收集方式)。 这两个属性的代码非常简单:

public bool IsSynchronized { get { return false; } }

private readonly object _syncRoot = new object();
public object SyncRoot { get { return _syncRoot; } }

问题是如何为它编写正确的单元测试。这个测试应该检查正确的用法和不正确的用法。

我认为这不属于您的责任范围。
SyncRoot
属性用于防止使用您的集合类的人想要同步读/写操作,从而提供了一个方便的对象来锁定其他对象。(事实上,该财产的用途被广泛误解;该财产本身通常被视为毫无用处,例如。)

如果您确实觉得有足够的理由实现这个接口,那么同步仍然完全超出了类型本身的范围(正如您通过让
IsSynchronized
属性返回
false
发出的信号);因此,它实际上不需要在您的端进行单元测试

事实上,我相信
ICollection
接口的实现者很容易忽略
SyncRoot
属性(将其设置为
null
)。这应该告诉你一些事情

对于单元测试,您可以简单地验证
SyncRoot
属性不是
null

my list类必须具有多个公共属性(包括IsSynchronized和SyncRoot)

事实并非如此。这可以追溯到.NET版本1,并被广泛认为是一个巨大的错误。它造成了错误的线程安全感,使许多程序员陷入了深深的麻烦。这样的类并非在所有情况下都是线程安全的,迭代一个类则不是。它完全被丢弃在.NET 2.0通用集合类中。你应该d不实现ICollection,现代集合类应该是泛型的并实现
ICollection
。不幸的是,这仍然需要实现IEnumerable,这是一个我们可能永远无法摆脱的遗留问题。如果使用显式实现来实现它,则此类方法不是公共的


第二个考虑因素是实现ICollection是否是一个好主意。链表会使类似Count的成员变得昂贵,本质上是O(n)。您需要单独跟踪列表中的元素数,使其成为O(1).NET LinkedList类也是一个双链接列表集合类,可以做到这一点。

我认为实现
ICollection
实际上并不需要实现
ICollection
;通用版本只继承自
IEnumerable
。谢谢@Dan,你说得很对。被实现它的LinkedList绊倒了。更新。>它制造了一种错误的线程安全感,使许多程序员陷入了深深的麻烦。那么有什么常见的方法(模式)吗是否要使集合线程安全?>也是一个双链接列表集合类的.NET LinkedList类可以做到这一点。是的,我知道。我刚刚尝试使用一些附加功能实现自己的此类集合。offtop。对不起,我是stackoverflow新手,我还不知道如何将标记应用于注释。很抱歉,我的English也是。在.net 4中有线程安全的并发集合,但这些集合通常有一个专门为线程安全原子操作设计的api。但是在许多情况下,您不希望使集合本身具有线程安全性,而是希望使其上构建的类具有线程安全性。