求值顺序、实例和方法参数
本文关键字:方法 参数 实例 顺序 | 更新日期: 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
}
=总是赋值
==将比较两个值