Igo*_*nko 3 c# tdd multithreading unit-testing thread-safety
我正在使用TDD方法编写一个双向链表.此集合类型不是线程安全的.为了实现ICollection接口,我的列表类必须具有多个公共属性(包括IsSynchronized和SyncRoot,它们用于提供使用线程安全的集合方式).这两个属性的代码非常简单:
public bool IsSynchronized { get { return false; } }
private readonly object _syncRoot = new object();
public object SyncRoot { get { return _syncRoot; } }
Run Code Online (Sandbox Code Playgroud)
问题是如何为它编写正确的单元测试.此测试应检查正确的用法和错误使用.
我的列表类必须有几个公共属性(包括IsSynchronized和SyncRoot
它没有.这可以追溯到.NET版本1,并被广泛认为是一个巨大的错误.它造成了一种虚假的线程安全感,让很多程序员陷入了困境.在所有情况下,这样的类实际上并不是线程安全的,迭代一个不是.它完全被删除在.NET 2.0泛型集合类中.并且您不应该实现ICollection,现代集合类应该是通用的并且实现ICollection<T>.不幸的是,仍然需要实现IEnumerable,这是我们可能永远不会摆脱的遗产.您使用显式实现来实现它,这样的方法不公开.
第二个考虑因素是实施ICollection <>是否是一个好主意.链表使像Count这样的成员贵,它本质上是O(n).您需要分别跟踪列表中的元素数量,使其为O(1)..NET LinkedList <>类也是一个双向链表集合类,它确实这样做.