【发布时间】:2013-11-24 17:22:58
【问题描述】:
例如,给定以下代码:
int? ReallyComplexFunction()
{
return 2; // Imagine this did something that took a while
}
void Something()
{
int i = ReallyCleverFunction() ?? 42;
}
... 是否保证该函数只会被调用一次?在我的测试中,它只被调用一次,但我看不到任何文档说明我可以依赖这种情况。
编辑
我可以猜到它是如何实现的,但请注意:我们是开发人员。我们不应该在猜测和假设上蒙混过关。例如,所有未来的实现都一样吗?其他平台的语言实现是否相同?这取决于语言的规范以及它提供的保证。例如,未来的或不同的平台实现(不是一个好的,但有可能)可能会在 ?? 实现中做到这一点:
return ReallyComplexFunction() == null ? 42 : ReallyComplexFunction();
如果没有返回null,它将调用ReallyComplexFunction 两次。 (虽然这看起来是一个荒谬的实现,但如果你用一个可以为空的变量替换函数,它看起来很合理:return a == null ? 42 : a)
如上所述,我知道在我的测试中它只被调用一次,但我的问题是C# 规范是否保证/指定左侧只会被调用一次? 如果是,在哪里?我在C# Language Specification for ?? operator(我最初在其中寻找我的查询的答案)中看不到任何此类提及。
【问题讨论】:
-
为什么你认为它会被调用两次?
-
这不是一个愚蠢的问题。有一些奇怪的情况是左手??可以调用两次,看这里stackoverflow.com/q/6256847/2609288
-
@Baldrick:该问题的答案确定行为是编译器中的错误,即它不是预期的行为。
-
@Baldrick,谢谢。这是你引用的一个有趣的案例。还有助于巩固应该调用一次的假设!
-
这不是规范。搜索 C# 规范,然后阅读第 7.13 节,它清楚地回答了您的问题:“在运行时,首先评估
a。如果a不为空,则a成为结果。否则,b被求值并转换为A类型,这就是结果。"