为什么 "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。
我的问题是:
- 为什么 "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 语句根本没有用) .
我发现了编译器的一个非常酷的功能。但是,我无法理解这种行为的逻辑。
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。
我的问题是:
- 为什么 "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 语句根本没有用) .