C# 什么时候锁定类型是个好主意?

C# 什么时候锁定类型是个好主意?,c#,multithreading,locking,thread-safety,C#,Multithreading,Locking,Thread Safety,从其他问题中,我可以看出锁定类型是个坏主意。但这样做是可能的,所以我想知道这样做是否是件坏事,为什么允许这样做?我假设一定有好的用例用于它的用途,那么有人能告诉我它们是什么吗?这几乎总是一个坏主意: 任何人都可以从代码中的任何地方锁定类型,因此如果不查看所有代码,就无法确保不会出现死锁 锁定类型甚至会导致AppDomains之间的死锁。见乔·达菲的文章: 这是允许的,因为几乎没有限制您可以使用什么作为锁定对象。换句话说,它并没有被明确允许——只是.NET框架中没有任何代码不允许它 《调试Mi

从其他问题中,我可以看出锁定类型是个坏主意。但这样做是可能的,所以我想知道这样做是否是件坏事,为什么允许这样做?我假设一定有好的用例用于它的用途,那么有人能告诉我它们是什么吗?

这几乎总是一个坏主意:

  • 任何人都可以从代码中的任何地方锁定类型,因此如果不查看所有代码,就无法确保不会出现死锁
  • 锁定类型甚至会导致AppDomains之间的死锁。见乔·达菲的文章:
这是允许的,因为几乎没有限制您可以使用什么作为锁定对象。换句话说,它并没有被明确允许——只是.NET框架中没有任何代码不允许它


《调试Microsoft.NET应用程序》一书中有一个FxCop规则的源代码
DoNotLockOnTypes
,如果您试图这样做,它会警告您。()

许多不好的想法进入了编程语言,因为没有语言设计师能够预测未来。人类创造的任何语言都会有疣

一些例子:

  • Hejlsberg(原始文章:)向C#添加了不可为null的类引用。(我希望他也能解决这个问题。)
  • C++委员会与ValSube搞砸了,在众多其他次要和重大的遗憾中,出口。
  • Java的模板是一个拙劣的工作(OMG,type elision!),旨在避免更改VM,当他们意识到VM无论如何都必须更改时,进行必要的返工为时已晚
  • Python的作用域规则是一个持续的刺激因素,无数次改进它的尝试并没有真正起到多大的作用(虽然有一点,但没有多大)

  • 要理解为什么这是一个坏主意,请看一看这篇文章

    这是允许的,因为语言/框架设计者决定能够锁定从
    System.Object
    派生的任何东西。没有人可以阻止它,因为
    System.Type
    派生自
    System.Object
    (与其他所有.NET类型一样)

    请签名:

    void Foo(object o)
    
    编译器如何强制执行
    o
    不是
    System.Type
    ?当然,您可以在运行时检查它,但这会影响性能


    当然,可能会有一些非常奇特的情况,人们可能需要锁定一个类型。也许CLR是在内部完成的。

    语言开发人员无法预见程序员需要的每一种用法。为什么要限制对一小部分程序员有用的东西呢?啊,这解释了很多。由于typeof()返回一个可锁定类型的对象,因此它可以允许锁定,尽管这通常不是一个好主意。现在我更明白了。谢谢