【发布时间】:2017-09-06 22:46:34
【问题描述】:
由于引入了 C# 7.0 的按引用返回功能,并且根据我的理解,像这样的功能需要在编译器上进行一些重新布线以仅将此引用存储在位于堆上的变量上,是否可以存储返回对堆栈上变量的引用,还是新的 ref 声明确保变量始终存储在堆上?
ref int x = ref DoSomething(data);
// Is the value of x now on the stack or the heap? Or is x stored on the stack as a reference and the value on the heap?
我的理解是基于this article:
最后,CLR 确实允许“ref 返回类型”;理论上你可以 有一个方法“ref int M() { ... }”返回一个对 整数变量。如果出于某种奇怪的原因我们曾经决定允许 在 C# 中,我们必须修复编译器和验证器,以便它们 确保只能将 refs 返回到 已知在堆上,或已知在堆栈上“较低” 比被调用者。
【问题讨论】:
-
如果它是一个局部变量,那么它肯定会在堆栈上
-
@EhsanSajjad 如果它只是一个局部变量,那么您无法从
ref返回方法返回它。 -
你能详细说明@Servy 的意思吗?
-
@EhsanSajjad 自己试试看。它不会编译,编译器错误会或多或少地告诉你我告诉你的内容。如果您可以从 ref-returning 方法返回对本地的引用,那么您将引用一个超出范围的变量,而 C# 不允许这样做。
-
Eric 引用的内容回答了您的问题。返回的引用必须是对堆中值的引用或堆栈上更高的值。所以它也可能是。