C# 什么时候锁定类型是个好主意?
从其他问题中,我可以看出锁定类型是个坏主意。但这样做是可能的,所以我想知道这样做是否是件坏事,为什么允许这样做?我假设一定有好的用例用于它的用途,那么有人能告诉我它们是什么吗?这几乎总是一个坏主意:C# 什么时候锁定类型是个好主意?,c#,multithreading,locking,thread-safety,C#,Multithreading,Locking,Thread Safety,从其他问题中,我可以看出锁定类型是个坏主意。但这样做是可能的,所以我想知道这样做是否是件坏事,为什么允许这样做?我假设一定有好的用例用于它的用途,那么有人能告诉我它们是什么吗?这几乎总是一个坏主意: 任何人都可以从代码中的任何地方锁定类型,因此如果不查看所有代码,就无法确保不会出现死锁 锁定类型甚至会导致AppDomains之间的死锁。见乔·达菲的文章: 这是允许的,因为几乎没有限制您可以使用什么作为锁定对象。换句话说,它并没有被明确允许——只是.NET框架中没有任何代码不允许它 《调试Mi
- 任何人都可以从代码中的任何地方锁定类型,因此如果不查看所有代码,就无法确保不会出现死锁
- 锁定类型甚至会导致AppDomains之间的死锁。见乔·达菲的文章:
《调试Microsoft.NET应用程序》一书中有一个FxCop规则的源代码
DoNotLockOnTypes
,如果您试图这样做,它会警告您。()许多不好的想法进入了编程语言,因为没有语言设计师能够预测未来。人类创造的任何语言都会有疣
一些例子:
要理解为什么这是一个坏主意,请看一看这篇文章 这是允许的,因为语言/框架设计者决定能够锁定从
System.Object
派生的任何东西。没有人可以阻止它,因为System.Type
派生自System.Object
(与其他所有.NET类型一样)
请签名:
void Foo(object o)
编译器如何强制执行o
不是System.Type
?当然,您可以在运行时检查它,但这会影响性能
当然,可能会有一些非常奇特的情况,人们可能需要锁定一个类型。也许CLR是在内部完成的。语言开发人员无法预见程序员需要的每一种用法。为什么要限制对一小部分程序员有用的东西呢?啊,这解释了很多。由于typeof()返回一个可锁定类型的对象,因此它可以允许锁定,尽管这通常不是一个好主意。现在我更明白了。谢谢