评估顺序,实例和方法参数

时间:2014-03-24 07:32:05

标签: c# syntax

假设我写了以下代码:

int x = 42;

if (x.Equals(x = Foo()))
    Console.WriteLine("ok");

其中Foo是返回整数的任何方法。是否保证方法调用目标(第一个x)在之前被评估,它被Foo()的返回值替换?换句话说,当且仅当ok的返回值等于42时,此代码才能保证打印Foo()吗?

我已经看到了其他问题,这些问题涉及参数评估的顺序,但他们没有谈到在运行时为非静态方法评估实例(第一个x)的时间 - - 有人可以为我澄清一下吗?

3 个答案:

答案 0 :(得分:3)

这是一个名为Sequence Points的问题。这经常代表when you put increment operator inside an expression发生的事情。

在C#的情况下,严格定义表达式和method parameters从左到右,从内到外进行评估,并且任何赋值(以及一般的副作用)对于表达式的其余部分立即可见。

您可以阅读更多here

答案 1 :(得分:1)

首先评估

x = Foo(),然后引用x(左边的那个),因此,这个条件将始终为真。

void Main()
{
    int x = 42;

if (x.Equals(x = Foo())) //This is always true.
    Console.WriteLine(x); //0
    Console.WriteLine("ok");
}

int Foo()
{
    return 0;
}

答案 2 :(得分:0)

首先会执行Foo(),但我会这样写:

int x = 42;

if (x == Foo()) {
    // ok
}

=将始终指定

==将比较两个值