代码之家  ›  专栏  ›  技术社区  ›  StepUp

为什么“ref”不将更新的值分配给下一个字段?

  •  3
  • StepUp  · 技术社区  · 9 年前

    我发现了编译程序的一个非常酷的特性。然而,我无法理解这种行为的逻辑。

    static int IncrementValue(ref int i) { return i++;}
    

    主要方法:

    static void Main(string[] args)
    {
        int a = 2;
        int b = IncrementValue(ref a);
        Console.WriteLine(a+b);
    } 
    

    输出为5。

    我的问题是:

    1. 为什么“b”字段等于2?(在我看来,它应该是3,因为“ref”关键字不是按值复制,而是按值复制字段。因此,“b”应该是“a+1”)
    2 回复  |  直到 9 年前
        1
  •  5
  •   Community ahmed    7 年前

    既然你把它写成了;

    return i++
    

    这将 回来 2 作为一个值,但它会增加 a 值为 3 在表达式之后。

    如果你把它写成;

    return ++i
    

    这将返回递增的值,即 3. ,自 3. 执行后,它将被打印 6 因此

    进一步阅读

        2
  •  1
  •   Patrick Hofman    9 年前

    i++ 邮递 递增运算符。它将在之后增加值,而不是在返回值之前。

    改变 我++ ++i 使其在返回值之前递增,或在单独的语句中递增值,然后返回值:

    static int IncrementValue(ref int i) { return ++i; }
    

    或:

    static int IncrementValue(ref int i) { i++; return i; }
    

    (返回整数时看到不同值的原因是结果被复制了。它不是引用,否则return语句根本没有用处)。