【发布时间】:2011-11-21 08:48:27
【问题描述】:
从其他问题我可以看出锁定类型是一个坏主意。但是有可能这样做,所以我想知道这样做是否是一件坏事,为什么允许这样做?我假设它的目的必须有很好的用例,所以有人可以让我知道它们是什么吗?
【问题讨论】:
-
语言开发人员无法预见程序员需要的每一种用法。为什么要限制可能对一小部分程序员有用的东西?
标签: c# multithreading locking thread-safety
从其他问题我可以看出锁定类型是一个坏主意。但是有可能这样做,所以我想知道这样做是否是一件坏事,为什么允许这样做?我假设它的目的必须有很好的用例,所以有人可以让我知道它们是什么吗?
【问题讨论】:
标签: c# multithreading locking thread-safety
这几乎总是一个坏主意:
这是允许的,因为对于您可以用作锁定对象的对象几乎没有任何限制。换句话说,它没有被明确允许——只是 .NET 框架中没有任何代码不允许它。
“调试 Microsoft .NET 应用程序”一书包含 FxCop 规则 DoNotLockOnTypes 的源代码,如果您尝试这样做,该规则会向您发出警告。 (thanks to Christian.K)
【讨论】:
要了解为什么一般来说这是一个坏主意,请查看文章Don't lock type objects。
这是允许的,因为语言/框架设计者决定能够锁定源自System.Object 的任何内容。没有人能阻止它,因为 System.Type 派生自 System.Object(与其他所有 .NET 类型一样)。
签下这个签名:
void Foo(object o)
编译器如何强制o 不是System.Type?您当然可以在运行时检查它,但这会对性能产生影响。
当然,在某些情况下,可能需要锁定一种类型。也许 CLR 会在内部进行。
【讨论】:
许多糟糕的想法在编程语言中找到了自己的方式,因为没有语言设计者可以预测未来。人类创造的任何语言都会有缺陷。
一些例子:
【讨论】: