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
находится в стеке, лебедка теряется, когда заканчивается выполнение метода.