我原来的代码是这样的
Object mylock = new object();
void Test()
{
lock(mylock)
{
}
}
编译成以下代码
void Test
{
object obj = mylock; // add a temporary variable
bool lockTaken = false;
try
{
Monitor.Enter(obj, ref lockTaken);
}
finally
{
if (lockTaken)
{
Monitor.Exit(obj);
}
}
}
我想知道为什么要添加临时变量而不是直接使用原始变量,如下所示。
void Test
{
bool lockTaken = false;
try
{
Monitor.Enter(mylock, ref lockTaken); // use original variable directly
}
finally
{
if (lockTaken)
{
Monitor.Exit(mylock); // use original variable directly
}
}
}
using
、lock
)被转换为最终代码,以防止重新分配所使用的变量。您确实不希望 finally
部分执行与原始操作开始时不同的值。
如果编译器仅使用
myLock
部分中 finally
的当前值,则会出现错误行为的代码示例:
object myLock = new object();
lock(myLock)
{
myLock = new object();
...
}
请注意,编译此类代码还会带来 CS0728 警告,因为尝试更改锁定变量将被忽略。