Здравствуйте, 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 считать объект достяжимым? В рассматриваемом случае ответ — нет.