Создающий блок создает и поддерживает ссылку для GC? - PullRequest
2 голосов
/ 25 февраля 2010

Это в основном ради любопытства, так как есть лучшие способы реализации практически любого варианта использования, который я могу придумать для этой конструкции (в C # и других языках, которые я использую по крайней мере регулярно), но недавно я увидел здесь: мьютекс в области видимости , который был классной концепцией.

Мой вопрос заключается в том, поддерживает ли оператор using ссылку (то есть: запрещает ли запуск ГХ) на объект, на который он действует?

Например, если бы я должен был сделать:

using (new ScopedMutex())
{
// ...
}

будет ли объект ScopedMutex поддерживать свое существование до конца используемого блока, или GC может запустить и утилизировать его в середине блока?

Ответы [ 3 ]

6 голосов
/ 25 февраля 2010

Нет, GC не будет его утилизировать. Ссылка на этот объект хранится в локальной переменной ( см. Этот ответ для получения дополнительной информации ). Локальная переменная считается корнем GC, и объект будет доступен из нее (она должна быть достижимой, чтобы блок using мог вызвать Dispose для него).

2 голосов
/ 25 февраля 2010

Компилятор C # неявно создаст переменную для вас. Оператор using фактически будет преобразован во что-то вроде следующего (вы можете использовать Redgate Reflector , чтобы увидеть точный код для себя, кстати):

ScopedMutex scopedMutex1 = new ScopedMutex();
try
{
    // ...
}
finally
{
    scopedMutex1.Dispose();
}
0 голосов
/ 25 февраля 2010

Он не будет располагаться в середине блока.

...