ref C# 7
От: #John Европа https://github.com/ichensky
Дата: 30.11.18 11:26
Оценка:
Здравствуйте,

Как работает 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
        }
    }
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.