为啥“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。

为啥在没有 ref 的情况下将 list 传递给一个类似于通过 ref 传递的函数?

为啥类型不能分配给泛型类型

当我将一个字典分配给另一个变量时,为啥 Python 会同时更新两个字典? [复制]