这 3 种类型的锁显然不好。还有什么其他类型的锁定不好?是否有 Stylecop / FxCop 规则可以捕捉到这一点?如果没有,那么您能帮我实现自定义规则吗?他们所有的代码都必须相似,对吧?
谢谢你。
John Robbins 的“调试 Microsoft .NET 应用程序”一书的示例(您可能需要在浏览器中允许弹出窗口)包含此类 FxCop 规则(DoNotLockOnPublicFields、DoNotLockOnThisOrMe、DoNotLockOnTypes 等)的源代码。看起来它们最初是为 FxCop 1.35 制作的,而 VS 2008 中的版本和最新的独立版本是 1.36(更不用说 VS2010)。所以他们可能需要一些调整,YMMV。
还有一个规则CA2002(不要锁定具有弱身份的对象),它检查类似的东西lock(typeof(...))
,但不检查lock(this)
基本上,您不应该锁定任何外部对象,除非这是一个专门的锁定对象(例如SyncRoot
非泛型上的属性ICollection
被设计用于)。这样做会带来引用的其他“用户”也锁定它的风险,从而导致不必要的锁定甚至死锁。
显然,this
并且typeof()
根据定义是外部对象。字符串是不可变的,并且字符串文字都是实习的,因此即使您直接在对象中分配了相同的引用,它也可以在不同的地方处于 unse 状态。
我不知道针对这些情况的 StyleCop 规则,但我对 StyleCop 或 FxCop 可用的内容没有一个很好的概述,因此很可能有一些东西可以检查这些情况。我只检查不是字符串且不直接在任何属性或方法中返回的私有成员的同步。