是否有任何.net语言支持返回引用类型

时间:2015-07-27 05:01:53

标签: .net clr

在他的一个blogs Eric Lippert中说:

  

最后,CLR确实允许“ref return types”;理论上你可以使用一个方法“ref int M(){...}”返回对整数变量的引用。如果出于某种奇怪的原因我们决定在C#中允许这样做

VB或F#是否支持此功能?我正在考虑各种方法来进行强类型属性集合,而不使用反射...

更新:C#7起支持此功能。

1 个答案:

答案 0 :(得分:0)

根据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#中返回引用类型的问题的答案:

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。