在C ++中,返回方法中在堆栈上分配的对象的引用,由于事实导致堆栈对象在方法离开范围时被销毁,因此产生垃圾值。鉴于C#结构在堆栈上分配,这会产生垃圾值吗?
struct Test
{
//data
}
Test Foo()
{
Test t1 = new Test();
return t1;
}
答案 0 :(得分:0)
关键字struct允许描述值类型。当您从方法返回值类型时,它会创建它的新副本。
答案 1 :(得分:0)
我认为你应该读到这个:http://mustoverride.com/ref-returns-and-locals/
简而言之,C#Design团队决定不允许通过引用返回本地变量。
- 禁止通过引用返回本地变量。这是 为C#选择的解决方案。 - 保证引用 不会超过引用的变量C#不允许返回 通过引用引用局部变量。有趣的是,这是 Rust使用的方法相同,但原因略有不同。 (Rust是一种RAII语言,在退出时会主动摧毁当地人 范围)
即使使用ref
关键字,如果您继续尝试此操作:
public struct Test
{
public int a;
}
public ref Test GetValueByRef()
{
var test = new Test();
return ref test;
}
您将看到编译器出现以下错误:
无法返回本地'测试'通过引用,因为它不是ref本地