Sobes.tech
Middle+

В каква конструкция се преобразува операторът lock в C#?

sobes.tech AI

Отговор от AI

Операторът lock в C# се преобразува в извиквания на методите Monitor.Enter и Monitor.Exit (или Monitor.TryEnter с последващ Monitor.Exit) в блок try...finally.

// Оригинален код с lock
object lockObject = new object();
lock (lockObject)
{
    // Защитен код
}

// Трансформацията ще направи приблизително следното:
object lockObject = new object();
bool lockTaken = false; // Флаг за следене дали мониторът е взет
try
{
    Monitor.Enter(lockObject, ref lockTaken); // Опит за вземане на монитора
    // Може да се използва `Monitor.TryEnter` вместо `Monitor.Enter`
    if (lockTaken) // Проверка дали мониторът е взет
    {
        // Защитен код
    }
}
finally
{
    if (lockTaken) // Освобождаване на монитора само ако е взет
    {
        Monitor.Exit(lockObject);
    }
}

Използването на Monitor.Enter с параметър ref bool lockTaken и блок try...finally гарантира, че мониторът ще бъде освободен дори при възникване на изключение в защитения код.