C # передает член класса как параметр ref

Я не понимаю, почему можно передать член экземпляра класса в качестве параметра 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
    }
}

person kaalus    schedule 08.01.2017    source источник
comment
obj не может быть GC'd в этот момент, поскольку есть ссылка на него. CLR умнее, чем вы думаете.   -  person Daniel A. White    schedule 08.01.2017
comment
F не может (в обычном C #) содержать ссылку на value после завершения выполнения. Не будет случая, чтобы obj был кандидатом на сборку мусора, пока F выполняется.   -  person Rob    schedule 08.01.2017
comment
@ DanielA.White Это не может быть GC'd, но может быть перемещено с помощью GC.   -  person kaalus    schedule 08.01.2017
comment
@Rob Он не может быть собран сборщиком мусора, но может быть перемещен сборщиком.   -  person kaalus    schedule 08.01.2017
comment
true, но потоки приостанавливаются, когда GC запущен, и он может перемещать все, что находится под крышками.   -  person Daniel A. White    schedule 08.01.2017
comment
Этот пост может представлять интерес.   -  person Rob    schedule 08.01.2017


Ответы (1)


Означает ли это, что параметры ref - это больше, чем просто внутренний указатель под капотом?

Да, именно это и означает. Если бы это был просто указатель, они бы назвали его указателем, а не ссылкой. Вместо этого для ссылок GC знает об исходном объекте и правильно отслеживает вещи, поэтому ссылка остается с объектом, и объект не будет собран до выхода из метода.

person Joel Coehoorn    schedule 08.01.2017