【问题标题】:C#7 ref return: what stays in memory: the class instance or the ref returned property?C#7 ref return:什么留在内存中:类实例或 ref 返回的属性?
【发布时间】:2018-07-28 05:14:50
【问题描述】:
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 实例保存在内存中,因为有人持有对该实例的某个字段的引用,那么在这个示例中,为什么 s 不能保存在内存中:

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

【问题讨论】:

    标签: ref c#-7.0


    【解决方案1】:

    因为s在栈上,所以方法执行结束时winch会丢失。

    【讨论】:

      【解决方案2】:

      GetData() 返回后,内存中保存了什么?完整的 MyDataStructure 实例?还是只有整数?

      MyDataStructure 是。它存在于堆中,并且您可以引用其中的一个字段。

      为什么在这个例子中s不能保存在内存中

      因为虽然它指向的堆上的字符串存在于堆上,但s 本身是一个不在堆上的本地字符串。作为本地,方法完成后就不再存在了。

      【讨论】:

      • 顺便说一句。至少在某些此类情况下,可以将s 包装在堆上的某些东西中,类似于提升本地人。虽然这可能会令人困惑,并且在为了效率而精确地尝试某些事情时,一些代码不仅效率低下而且效率低下,所以总而言之,我很高兴他们没有采用这种方法。
      猜你喜欢
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      相关资源
      最近更新 更多