C#7 ref return: что остается в памяти: экземпляр класса или свойство ref ref?

public ref int GetData()
{
    var myDataStructure = new MyDataStructure();
    return ref myDataStructure.Data;
}

public class MyDataStructure
{
    private int _data;
    public ref int Data => ref _data;
}

Это использует новую функцию возврата C#7. После возврата GetData(), что хранится в памяти? Полный экземпляр MyDataStructure? Или только целое число?

Если экземпляр MyDataStructure хранится в памяти, потому что кто-то держит ссылку на поле этого экземпляра, почему нельзя сохранить его в памяти в этом примере:

public ref string GetString()
{
    string s = "a";
    return ref s; 
}

2 ответа

Решение

После возврата GetData(), что хранится в памяти? Полный экземпляр MyDataStructure? Или только целое число?

MyDataStructure является. Он существует в куче, и у вас есть ссылка на поле внутри него.

почему в этом примере нельзя хранить s в памяти

Поскольку строка в куче, на которую она указывает, существует в куче, s сам по себе является местным, которого нет в куче. Как локальный, он больше не существует после завершения метода.

Так как s находится в стеке, лебедка теряется, когда заканчивается выполнение метода.

Другие вопросы по тегам