为什么" ref"没有将更新的值分配给下一个字段?

时间:2015-03-12 07:50:55

标签: c# .net pass-by-reference ref post-increment

我发现了一个非常酷的编译器功能。但是,我无法理解这种行为的逻辑。

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 个答案:

答案 0 :(得分:5)

因为你把它写成了;

return i++

这将仍然返回2作为值,但在表达式后它会将a值增加到3

如果你把它写成;

return ++i

这将返回递增的值3,并且由于a在执行后将3,因此将打印6

进一步阅读

答案 1 :(得分:1)

i++ post 增量运算符。它会在之后递增值,而不是在返回值之前。

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

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

或者:

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

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