为啥“ref”没有将更新的值分配给下一个字段?
Posted
技术标签:
【中文标题】为啥“ref”没有将更新的值分配给下一个字段?【英文标题】:Why is "ref" not assigning updated value to the next field?为什么“ref”没有将更新的值分配给下一个字段? 【发布时间】:2015-05-14 07:00:22 【问题描述】:我发现了一个非常酷的编译器功能。但是,我无法理解这种行为的逻辑。
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”)
【问题讨论】:
你知道i++
的返回值是非递增值吗?也许你打算写return ++i;
?
这不是一个“很酷的功能”。 ++
是模糊的,正如你所发现的。
出于某种奇怪的原因,人们使用 i++ 的频率高于 ++i,其中 ++i 在许多情况下更正确,导致错误更少。
【参考方案1】:
既然你把它写成;
return i++
这仍然将2
作为值返回,但在表达式之后它将a
值增加到3
。
如果你把它写成;
return ++i
这将返回递增的值3
,并且由于a
在执行后将是3
,因此将打印6
作为结果。
进一步阅读
What is the difference between ++i and i++?【讨论】:
不是真的在它返回之后,而是在表达式确定了它的值之后。基本上该语句将执行如下:读取i
的当前值,然后递增i
,然后返回我们在递增之前读取的值。返回仍然是该方法中完成的最后一件事。
@LasseV.Karlsen 是的,在表达式之后 是很清楚的解释。由于英语不是我的母语,有时我无法正确表达自己。【参考方案2】:
i++
是 post 增量运算符。它将在之后增加值,而不是在返回值之前。
将i++
更改为++i
使其在返回值之前递增,或者在单独的语句中递增值然后返回值:
static int IncrementValue(ref int i) return ++i;
或者:
static int IncrementValue(ref int i) i++; return i;
(返回整数时看到不同值的原因是结果被复制。它不是引用,否则返回语句根本没有用)。
【讨论】:
以上是关于为啥“ref”没有将更新的值分配给下一个字段?的主要内容,如果未能解决你的问题,请参考以下文章
将存储在 IBAction 中的值传递给下一个 Nib UITextField。