什么时候锁定类型是个好主意?
本文关键字:好主意 锁定 类型 什么时候 | 更新日期: 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会在内部做
许多糟糕的想法都进入了编程语言,因为没有语言设计者能够预测未来。任何人类创造的语言都有缺陷。
一些例子:
- Hejlsberg希望(原文:编程语言的A-Z: c# - Computerworld)他在c#中添加了不可空的类引用。(我希望他也能把const问题解决掉。) c++委员会搞砸了valarray和export,以及其他许多大大小小的遗憾。
- Java的模板是一个拙劣的工作(OMG,省略类型!),旨在避免更改VM,当他们意识到VM无论如何都必须更改时,做必要的返工为时已晚。
- Python的作用域规则是一个持续的刺激,许多改进它的尝试都没有真正帮助(一点点,但不是很多)。