C# 将锁设置为null
这合法吗?(即,将锁设置为空) 如果C# 将锁设置为null,c#,null,locking,C#,Null,Locking,这合法吗?(即,将锁设置为空) 如果a不是构造函数中的局部变量,而是字段,则这是合法的 锁定是在有效对象上启动的。然后该引用为null,但锁仍对以前的非null值进行操作 但是,如果进行了另一次锁定尝试,它将最终成为一个错误。查看此问题:您本可以执行的直接实验显示,lock(null)抛出ArgumentNullValueException。另一个问题是您的代码有语法错误: public void ResetA() { lock(a) { ... // <- a is unde
a
不是构造函数中的局部变量,而是字段,则这是合法的
锁定是在有效对象上启动的。然后该引用为null,但锁仍对以前的非null值进行操作
但是,如果进行了另一次锁定尝试,它将最终成为一个错误。查看此问题:您本可以执行的直接实验显示,lock(null)
抛出ArgumentNullValueException。另一个问题是您的代码有语法错误:
public void ResetA() {
lock(a) { ... // <- a is undefined; probably "B" class should have "A a" field
我已经编辑了你的标题。请看,“,其中的共识是“不,他们不应该”。你想实现什么?为什么这不应该是合法的(除非它没有编译)?你不可能想出一个更糟糕的例子。如果“这合法吗”意味着“我的代码会崩溃吗?”那么答案是否定的。C#编译器将生成一个隐藏变量来存储对锁对象的引用,以便在解锁时不会崩溃。如果“这合法吗”意味着“我的代码会出现故障吗?”那么答案是肯定的。嗨,我修复了代码,知道如何解决问题(就像你向m_SyncObj建议的那样),但这不是我的问题
public void ResetA() {
lock(a) { ... // <- a is undefined; probably "B" class should have "A a" field
Class B {
// Object to be used in locking.
// It's private: we don't want to let anyone
// interfere in our internal locking policy
// (so we do not use e.g. lock(this) etc)
private Object m_SyncObj = new Object();
A a = new A();
public void ResetA() {
lock (m_SyncObj) {
// A little bit strange lock block unless "a" is locked somewhere else as well
a = null;
}
}
...