【问题标题】:C# return struct reference from methodC#从方法返回结构引用
【发布时间】:2018-03-20 21:37:26
【问题描述】:

在 C++ 中,在方法中返回分配在堆栈上的对象的引用会产生垃圾值,因为堆栈对象在方法离开作用域后立即被销毁。鉴于在 C# 中结构是在堆栈上分配的,这是否也会产生垃圾值?

struct Test
{
    //data
}

Test Foo()
{
    Test t1 = new Test();
    return t1;
}

【问题讨论】:

  • Given that in C# structs are allocated on the stack 这是一个错误的假设,因此您从中得出的任何结论都没有意义。
  • C# 中的结构是按值传递的。你没有在这里返回参考,所以没有。
  • @Sweeper 所有在其返回类型中没有标记为ref的方法都返回一个值,所有的方法都返回一个引用.类型是相关的,重要的是方法的签名。

标签: c# struct stack return


【解决方案1】:

C# 中的关键字struct 允许描述值类型。当您从方法返回值类型时,它会创建它的新副本。

【讨论】:

【解决方案2】:

我认为您应该阅读以下内容:http://mustoverride.com/ref-returns-and-locals/

简而言之,C# 设计团队决定禁止通过引用返回局部变量。

– 不允许通过引用返回局部变量。这是 为 C# 选择的解决方案。 - 保证参考确实 不超过引用的变量 C# 不允许返回 通过引用引用局部变量。有趣的是,这是 Rust 使用相同的方法,尽管原因略有不同。 (Rust 是一种 RAII 语言,退出时会主动破坏本地人 范围)

即使使用 ref 关键字,如果您继续尝试以下操作:

public struct Test
{
    public int a;
}

public ref Test GetValueByRef()
{
    var test = new Test();
    return ref test;
}

您将看到编译器错误如下:

不能通过引用返回本地“测试”,因为它不是本地引用

【讨论】:

  • 这也没有意义,因为局部变量在使用之前会超出范围。这样的事情在 C++ 中是可能的,但它会导致未定义的行为,并且很可能编译器会通知您这个错误。
猜你喜欢
  • 1970-01-01
  • 2017-03-25
  • 2015-12-18
  • 2022-07-07
  • 2015-02-14
  • 1970-01-01
  • 2012-04-18
  • 2015-12-05
  • 1970-01-01
相关资源
最近更新 更多