在锁定语句中抛出异常

以下代码将释放锁定。没问题。在幕后锁定声明作为 try finally 工作

lock(locker)
{
    throw new Exception();
}

C#5.0 规范中可以看到更多 :

形式的 lock 声明

lock (x) ...

其中 x 是一个引用类型的表达式,恰好相当于

bool __lockWasTaken = false;
try {
    System.Threading.Monitor.Enter(x, ref __lockWasTaken);
    ...
}
finally {
    if (__lockWasTaken) System.Threading.Monitor.Exit(x);
}

除了 x 只评估一次。