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;
    }
  }
...