为什么要用括号将null括起来而不是直接返回null?

3
我在查看一些关于 IXmlSerializable 的MSDN文档时,发现示例代码列出了以下方法:
public XmlSchema GetSchema()
{
    return(null);
}

return nullreturn (null)之间是否存在语义差异,即它是否会调用一些编译器优化,还是纯粹的风格上的区别?


1
我们为什么会比你更清楚作者为什么添加了一个多余的括号呢? - Servy
2
@DLeh:如果微软让一个不熟悉这种语言的人来编写文档,我会感到惊讶。 - Tim Schmelter
1
@TimSchmelter 我也会这样:P。半开玩笑的回答。我之前没意识到你可以在return后面不加空格,它看起来确实像是一个方法。 - DLeh
2
@PhilipPittle:编译器优化与您使用的语法无关,否则这显然是编译器的错误。 - Tim Schmelter
1
你可能会觉得这个问题很有趣:https://dev59.com/jnI95IYBdhLWcg3wtwVe#2187498 - Eric Lippert
显示剩余10条评论
3个回答

4

return nullreturn (null) 之间有语义上的区别吗?

作为一个完整的语句,两者没有任何区别。在这种情况下,括号是多余的。

它会调用一些编译器优化吗?

完全不会。

它仅仅是样式上的区别吗?

很可能,这个例子来自于自动生成的代码。在这种情况下,生成任意表达式时,生成器并不知道表达式将在哪种上下文中使用。因此,为了保护原始意图,最简单的方法是将正在生成的表达式包装在括号中。这确保了它被理解为其周围上下文中的“原子子表达式”。

考虑到生成器将输出 a+b 并且调用者需要将其乘以 c 的情况。错误的方法是简单地连接 a+b*c 导致 a+b*c ,这显然是错误的。但是,当嵌套的生成器返回 (a+b) 时,整个结构按预期工作,而无需进行任何复杂的决策:(a+b)*c

请注意,现代代码生成器通常在多次处理表达式树时工作,而不是传递字符串,因此它们更容易消除多余的括号,使结果更易于我们人类阅读。


1
你认为这个 MSDN 代码示例是自动生成的吗? - JLRishe
1
@JLRishe 是的,可能是这样。也许只是涉及到的方法,它可能是由IDE功能自动生成的,帮助开发人员实现“IXmlSerializable”。 - Ondrej Tucny

1

1
作为一般规则,如果两个语句在语义上等效(但在语法上不同),任何合适的编译器都将对它们应用相同的优化。由于C#没有指定return null;return(null);的含义之间的任何区别,因此任何假设的编译器优化都将应用于这两者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接