В параметрах С#, ref
и out
, насколько мне известно, передаются, передавая только исходный адрес соответствующего значения. Этот адрес может быть внутренним указателем на элемент в массиве или поле внутри объекта.
Если происходит сбор мусора, возможно, что единственная ссылка на какой-либо объект осуществляется через один из этих внутренних указателей, как в:
using System;
public class Foo
{
public int field;
public static void Increment(ref int x) {
System.GC.Collect();
x = x + 1;
Console.WriteLine(x);
}
public static void Main()
{
Increment(ref new Foo().field);
}
}
В этом случае GC должен найти начало объекта и обработать весь объект как достижимый. Как оно это делает? Нужно ли сканировать всю кучу в поисках объекта, содержащего этот указатель? Это кажется медленным.