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

本文关键字:好主意 锁定 类型 什么时候 | 更新日期: 2023-09-27 18:15:20

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

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

这几乎总是一个坏主意:

  • 任何人都可以在代码的任何地方锁定类型,所以如果不查看所有代码,就无法确保不会出现死锁。
  • 锁定一个类型甚至会导致appdomain之间的死锁。参见Joe Duffy的文章:不要锁定流血封送对象。

这是允许的,因为几乎没有限制你可以使用什么作为你的锁对象。换句话说,它并不是特别允许的——只是。net框架中没有任何代码禁止它。

"调试Microsoft . net应用程序"一书中有一个FxCop规则DoNotLockOnTypes的源代码,如果你试图这样做,它会警告你。(感谢Christian.K)

要了解为什么这是一个坏主意,请参阅不要锁定类型对象这篇文章。

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

签名:

void Foo(object o)

编译器如何强制o不是System.Type ?当然,您可以在运行时检查它,但这会对性能产生影响。

当然,也可能存在需要锁定类型的特殊情况。也许CLR会在内部做

许多糟糕的想法都进入了编程语言,因为没有语言设计者能够预测未来。任何人类创造的语言都有缺陷。

一些例子:

  1. Hejlsberg希望(原文:编程语言的A-Z: c# - Computerworld)他在c#中添加了不可空的类引用。(我希望他也能把const问题解决掉。)
  2. c++委员会搞砸了valarray和export,以及其他许多大大小小的遗憾。
  3. Java的模板是一个拙劣的工作(OMG,省略类型!),旨在避免更改VM,当他们意识到VM无论如何都必须更改时,做必要的返工为时已晚。
  4. Python的作用域规则是一个持续的刺激,许多改进它的尝试都没有真正帮助(一点点,但不是很多)。