Я пытаюсь выяснить тонкости системы сбора мусора .NET, и у меня есть вопрос, связанный с ссылочными параметрами С#. Если я правильно понимаю, переменные, определенные в методе, хранятся в стеке и не зависят от сбора мусора. Итак, в этом примере:
public class Test
{
public Test()
{
}
public int DoIt()
{
int t = 7;
Increment(ref t);
return t;
}
private int Increment(ref int p)
{
p++;
}
}
возвращаемое значение DoIt() будет равно 8. Так как местоположение t находится в стеке, тогда эта память не может быть собрана или сжата мусором, а ссылочная переменная в Increment() всегда укажет на правильное содержимое t.
Однако предположим, что имеем:
public class Test
{
private int t = 7;
public Test()
{
}
public int DoIt()
{
Increment(ref t);
return t;
}
private int Increment(ref int p)
{
p++;
}
}
Теперь t сохраняется в куче, поскольку это значение конкретного экземпляра моего класса. Разве это не проблема, если передать это значение в качестве эталонного параметра? Если я передать т в качестве опорного параметра, р будет указывать на текущее местоположение т. Однако, если сборщик мусора перемещает этот объект во время компактного устройства, разве это не испортит ссылку на t в Increment()? Или сборщик мусора обновляет даже ссылки, созданные путем передачи ссылочных параметров? Должен ли я вообще об этом беспокоиться? Единственное упоминание о том, что проблема с памятью, сжимаемой в MSDN (которую я могу найти), связана с передачей управляемых ссылок на неуправляемый код. Надеюсь, это потому, что мне не нужно беспокоиться о каких-либо управляемых ссылках в управляемом коде.:)