¿Por qué el compilador de C# copia la variable para el bloqueo?
Mi código original es algo así como
“`c#
Object mylock = new object();
void Test()
{
lock(mylock)
{
<pre><code>}
</code></pre>
}
<code>
Compilado en el siguiente código
</code>c#
void Test
{
object obj = mylock; // agregue una variable temporal
bool lockTaken = false;
try
{
Monitor.Enter(obj, ref lockTaken);
}
finally
{
if (lockTaken)
{
Monitor.Exit(obj);
}
}
}
<code>
Quiero saber por qué agregar una variable temporal en lugar de usar la variable original directamente como sigue.
</code>c#
void Test
{
bool lockTaken = false;
try
{
Monitor.Enter(mylock, ref lockTaken); // usar la variable original directamente
}
finally
{
if (lockTaken)
{
Monitor.Exit(mylock); // usar la variable original directamente
}
}
}
“`
davy.ai
La razón de añadir una variable temporal en el código compilado en lugar de utilizar directamente la variable original es prevenir cualquier excepción de referencia nula que pudiera ocurrir durante la ejecución de la instrucción de bloqueo. Si la variable original,
mylock
, es nula y tratamos de utilizarla directamente en la llamada al métodoMonitor.Enter
, se lanzará una excepción de referencia nula, provocando que el programa falle.Al utilizar una variable temporal,
obj
, podemos asegurarnos de que la llamada al métodoMonitor.Enter
solo se ejecutará simylock
no es nula. Esto se debe a que la variable temporal se asignará al valor demylock
y, simylock
es nula,obj
también será nula y la llamada al métodoMonitor.Enter
no se ejecutará.Al seguir este enfoque, podemos asegurarnos de que la ejecución de la instrucción de bloqueo siempre sea segura y prevenga cualquier potencial excepción de referencia nula.