求值顺序、实例和方法参数

本文关键字:方法 参数 实例 顺序 | 更新日期: 2023-09-27 17:52:13

假设我编写以下代码:

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

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

我已经看到了其他的问题,处理参数计算的顺序,但他们没有谈论实例(第一个x)在非静态方法的运行时被评估——有人可以为我澄清这一点吗?

求值顺序、实例和方法参数

这个问题叫做序列点。这通常表示在表达式中放入自增运算符时发生的情况。

在c#的情况下,严格定义表达式和方法参数从左到右,从内到外求值,任何赋值(和一般的副作用)对表达式的其余部分立即可见。

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;
}

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

int x = 42;
if (x == Foo()) {
    // ok
}

=总是赋值

==将比较两个值