Я не понимаю, почему можно передать член экземпляра класса в качестве параметра ref функции.
Объект может быть перемещен сборкой мусора во время выполнения функции, что делает ссылку недействительной.
Тем не менее, похоже, что это разрешено и работает. Означает ли это, что параметры ref - это больше, чем просто внутренний указатель под капотом?
class A
{
public int Value;
}
class Test
{
static void F(ref int value)
{
value = 7;
}
static void Main()
{
A obj = new A();
// obj can be moved by GC, so "ref obj.Value" cannot be a native pointer under the hood
F(ref obj.Value);
System.Console.WriteLine(obj.Value); // Prints 7
}
}
obj
не может быть GC'd в этот момент, поскольку есть ссылка на него. CLR умнее, чем вы думаете. - person Daniel A. White   schedule 08.01.2017F
не может (в обычном C #) содержать ссылку наvalue
после завершения выполнения. Не будет случая, чтобыobj
был кандидатом на сборку мусора, покаF
выполняется. - person Rob   schedule 08.01.2017