在鎖定語句中丟擲異常

以下程式碼將釋放鎖定。沒問題。在幕後鎖定宣告作為 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 只評估一次。