ldflda выталкивает сам объект из стека. он не сможет "протолкнуть" объект как корень GC, потому что, когда он узнает, чтобы вытолкнуть его? Единственный разумный способ узнать это - использовать стек ... Я почти уверен, что объект сохраняется во внутреннем указателе.
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 должен найти начало объекта и обработать весь объект как достижимый. Как оно это делает? Нужно ли сканировать всю кучу в поисках объекта, содержащего этот указатель? Это кажется медленным.