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

Why is "ref" not assigning updated value to the next field?

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

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")

因为你把它写成;

return i++

这将 仍然 return 2 作为一个值,但它会在表达式后将 a 值增加到 3 .

如果你写成;

return ++i

这将 return 递增值 3,并且由于 a 在执行后将是 3,它将被打印 6结果。

进一步阅读

  • What is the difference between ++i and i++?

i++post 增量运算符。它会在之后增加值,而不是在值被 returned.

之前

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

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

或:

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

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