【发布时间】:2015-07-27 05:01:53
【问题描述】:
在他的blogsEric Lippert 之一中说:
最后,CLR 确实允许“ref 返回类型”;理论上你可以有一个方法“ref int M() { ... }”返回一个整数变量的引用。如果出于某种奇怪的原因我们曾经决定在 C# 中允许这样做
VB 或 F# 都支持这个吗?我在想各种方法来做强类型属性集合,而不使用反射......
更新: 从C#7 开始支持。
【问题讨论】:
在他的blogsEric Lippert 之一中说:
最后,CLR 确实允许“ref 返回类型”;理论上你可以有一个方法“ref int M() { ... }”返回一个整数变量的引用。如果出于某种奇怪的原因我们曾经决定在 C# 中允许这样做
VB 或 F# 都支持这个吗?我在想各种方法来做强类型属性集合,而不使用反射......
更新: 从C#7 开始支持。
【问题讨论】:
根据 Eric Lippet - C# 确实支持此功能。
完全有可能创建一个同时支持两者的 C# 版本 这些功能。然后你可以做类似的事情
static ref int Max(ref int x, ref int y)
{
if (x > y)
return ref x;
else
return ref y;
}
然后调用它
int a = 123;
int b = 456;
ref int c = ref Max(ref a, ref b);
c += 100;
Console.WriteLine(b); // 556!
您可以阅读有关他对 C# 中返回 ref 类型问题的回答的更多信息:
Why doesn't C# support the return of references?
至于你关于 VB 的问题 - 该语言不支持它:
按引用返回?
虽然函数可以通过引用传递变量,但它们不能返回 他们那样。当一个函数返回时,它的局部变量不会 不再存在(或者如果它们是堆分配的,则正在等待清理)。 因此,函数总是按值返回;因为当地 变量不再有有效的内存地址,没有任何 要返回的变量引用。
把它们放在一起,当你从一个函数返回一个对象时, 唯一被复制的是对象的地址。当你 从函数返回一个值类型,该值本身被复制。
这意味着引用类型本质上是值类型,其中 value 是堆上对象的内存地址,(或 Nothing)
来源:VB.NET, Is Object Returned by Reference from Function
我找不到与 F# 相同的信息,但我猜它与 VB 相同 - 所以答案是 - 你不能在 F# 中返回 ref。
【讨论】: