Здравствуйте,
Как работает ref в C# 7?
В функции `func` мы создаем массив, и возвращаем указатель на один из его эллементов. По идее GC должен при создании массива, под объект `arr` выделить в куче память, а после того как все ссылки будут потеряны на `arr` GC должен уничтожить этот объект. Но из функции мы возвращаем указатель не на сам объект `arr` , а на один из его эллементов.
Как GC понимает, что `arr` еще нельзя уничтожать, потому что один из его эллементов все еще используется?
Получется если GC не уничтожает `arr`, а в вызывающей функции виден только один эллемент из массива, значит произошла утечка памяти, до тех пор пока не уничтожится указатель на эллемент массива?
И что во время маркировки объектов на уничтожение GC приходится дополнительно сканировать память объекта для того что бы знать, есть ли ссылка на один из его эллементов?
public class Gg {
public ref int func() {
var arr = new int[6];
arr[3] = 54;
return ref arr[3];
}
}
class Program
{
static void Main(string[] args)
{
var g =new Gg();
ref int x = ref g.func();
g = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine($"{x}"); // 54
}
}