C#是否保证分支嵌套表达式的评估顺序?
C#显然可以处理嵌套和链式表达式。 如果嵌套和/或链式是线性的,则很明显在以下方式中评估表达式的顺序:
foo(baz(baz()。bop()))
can can 唯一的评估评估按照以下顺序:
-
baz()
-
bop()
-
bar()
-
foo()
,
但是如果嵌套不是线性吗?考虑: foo(baz())。bar(bop(bop())
显然必须是正确的:
-
baz
foo -
foo
bar
-
bop
bar
之前,但尚不清楚何时 bop
进行评估。
以下任何一个都是可行的顺序:
- 可能性#1
-
bop()
-
baz()
-
foo()
-
bar()
-
- 可能性#2
-
baz()
-
bop()
-
foo()
-
bar()
-
- 可能性#3
-
baz()
-
foo()
-
bop()
-
bar()
-
我的本能是3rd Option可能是正确的。即,在开始评估
.bar(bop())之前,它将完全评估
foo(baz())
当然,测试个人情况以查看发生的情况,这不会告诉我我的猜测是否会始终是真的吗?
但是我的问题是: 是定义为C#语言规范一部分的分支嵌套表达式的评估顺序,还是留给编译器的情境判断
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您会在。
具体来说,说:
因此,在评估
a
之前,给定表达式em(a)
,e
。对于
(
foo(baz())。bar(bop())
案例,如果我们正在查看bar
的评估(因此e
isfoo(baz())
,m
isbar
,参数列表为bop()
),这意味着在评估e
)之前,必须在评估bop
(参数列表)之前对其进行全面评估,这意味着“可能性#3”是正确的。还有 11.6.2.3参数列表的运行时间评估:
因此在expression
m(a,b)< /code>,
a
在评估b
之前进行了充分评估。You'll find the answers in Section 11 of the specification.
Specifically, 11.6.6 Function member invocation says:
So, given an expression
E.M(A)
,E
is fully evaluated beforeA
is evaluated.For the
Foo(Baz()).Bar(Bop())
case, if we're looking at the evaluation ofBar
(soE
isFoo(Baz())
,M
isBar
and the argument list isBop()
), this means thatFoo
(E
) must have been fully evaluated beforeBop
(the argument list) is evaluated, meaning that "possibility #3" is the correct one.There's also 11.6.2.3 Run-time evaluation of argument lists:
So in the expression
M(A, B)
,A
is fully evaluated beforeB
is evaluated.