Re[6]: Только что с интервью...
От: fedor.reznik  
Дата: 29.03.17 08:37
Оценка:
Здравствуйте, IT, Вы писали:

IT>Если указатель в стеке не обнулить или не переиспользовать, то висящий на нём объект будет болтаться в GC до выхода из метода. Вот я и спрашиваю, что там происходит.


Зависит от:
а) режима компиляции Debug/Release. В Debug гарантированно будет.
б) В Release чаще нет, то есть даже так — я не встречал ситуаций когда указатель на объект живет дольше, чем его последнее использование, но допускаю, что возможны случаи, что GC будет считать его достяжимым до конца метода.

В простейшем случае не зависит от скобок никак, тесты:

    [TestFixture]
    public class VisibilityTests
    {
        [Test]
        public void InBracketsTest()
        {
            {
                var foo = new Foo();
                foo.Baz();
            }

            dotMemory.Check(m => { Assert.AreEqual(0, m.GetObjects(set => set.Type.Is<Foo>()).ObjectsCount); });
        }

        [Test]
        public void NoBracketsTest()
        {
            var foo = new Foo();
            foo.Baz();

            dotMemory.Check(m => { Assert.AreEqual(0, m.GetObjects(set => set.Type.Is<Foo>()).ObjectsCount); });
        }
    }


Вообще говоря правильный вопрос — будет ли GC считать объект достяжимым? В рассматриваемом случае ответ — нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.