【问题标题】:Does any .net language support returning ref type是否有任何 .net 语言支持返回 ref 类型
【发布时间】:2015-07-27 05:01:53
【问题描述】:

在他的blogsEric Lippert 之一中说:

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

VB 或 F# 都支持这个吗?我在想各种方法来做强类型属性集合,而不使用反射......

更新:C#7 开始支持。

【问题讨论】:

    标签: .net clr


    【解决方案1】:

    根据 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。

    【讨论】:

    • 感谢您的参考。我会注意到 Eric 说可以构建一个 C# 版本来执行此操作,并且他已经这样做了,而不是交付的 C# 支持它。此外, hoodaticus 的回答,虽然似乎是在回答这个问题,但却是在回答一个完全不同的问题。不过,对链接很有用。
    • 对,你误解了我的话。我构建了一个具有该功能的 C# 私有测试版本,以证明它可以完成。我们决定不在实际产品中实际这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多