Область видимости C # и GC: Гарантируется ли, что внешний объект ссылочного типа останется действительным после назначения внутреннему объекту во вложенной области «использования»? - PullRequest
1 голос
/ 23 июня 2010

Гарантируется ли, что внешний объект ссылочного типа останется действительным после присвоения внутреннему объекту во вложенной «использующей» области видимости?

A x;
{
    using (A y = new A())
    {
        x = y;
    }
}
x.foo(); // Is x rock-solid, guaranteed to be still valid here, or is this iffy? i.e. will the call to x.foo() bomb or work only "by chance"?

Я обеспокоен тем, что натолкнулся на 2 статьи, в которых говорится о преждевременной сборке мусора,хотя их ситуации совершенно иные: http://www.curly -brace.com / favourite.html http://www.theserverside.net/tt/articles/showarticle.tss?id=GarbageCollection

Ответы [ 4 ]

3 голосов
/ 23 июня 2010

Объект x ссылки по-прежнему будет действительным объектом, но он будет удален.Он не подходит для сбора мусора, но может не находиться в пригодном для использования состоянии.В зависимости от реализации вызов метода для объекта может привести к выбрасыванию ObjectDisposedException.Проверьте документацию для конкретного класса, чтобы увидеть, если это так.

3 голосов
/ 23 июня 2010

Sort-оф.После того, как вы покинете блок using, будет вызван метод Dispose объекта, но ссылка на объект все еще будет существовать, поэтому вы все равно можете вызвать foo().Любой хорошо написанный объект, скорее всего, выдаст ObjectDisposedException, если вы попытаетесь получить к нему доступ после вызова Dispose.

1 голос
/ 23 июня 2010

Это будет действительная ссылка на объект, но этот объект будет удален и, вероятно, непригоден для дальнейшей деятельности (или если он был написан, чтобы позволить себе воскреснуть после вызова Dispose, вы 'Возможно, придется вручную утилизировать его позже).

0 голосов
/ 23 июня 2010

В конце использования области Dispose вызывается для объекта.Таким образом, экземпляр, на который ссылается x, будет удален.

...