什么时候使用表达式身体强壮的成员?[关闭]


24

C#6引入了表达式主体成员,这些成员允许仅返回表达式结果的方法和属性中的简化代码:

public override string ToString()
{
     return string.Format("{0} {1}", _field1, _field2);
}

变成:

public override string ToString() =>
    string.Format("{0} {1}", _field1, _field2);

由于我们现在有两种完全等效且有效的语法,因此必须使用一些经验法则来决定使用哪种语法。新的替代方法何时合适?


7
嗯,成员的身体是什么表情?
约尔格W¯¯米塔格

1
那将回答问题“何时可以使用身体强壮的成员”。
阿西克

7
不完全相关,但是您不能使用public override string ToString() => $"{_field1} {_field2}";吗?
Thaoden

3
@JorgWMittag我要添加“ ...没有副作用”。在不是纯粹功能的情况下以功能样式声明方法会产生误导。
2015年

Answers:


12

函数式编程语言仅包含表达式,因此大多数语言从一开始就具有这样的功能。当您有一个相对较短(经常重复)的表达式时,可以使用一个更短,更有意义的名称来代替它。

一个常见的例子是在其他地方使用的谓词,例如:

public static bool isOdd(int num) => (num % 2) == 1;

如果表达式太长,最好将其拆分为单独的函数,或者将一个函数命名为中间结果。如果它很短,但是您想不出一个好名字,那么最好只复制该表达式,而不要创建一个可怕的名字,诸如此类condition1


21

来自C#/。NET的Little Wonders:C#6中的表达式支持成员

那么,您应该使用它吗?一切都归结为风格。我的直觉是将其限制为可以一眼就能清楚理解的简单表达和陈述。

(重点是我的;请参阅下面的更新1)

以上文章摘要中的更多内容:

因此,C#6现在使我们能够指定带有表达式的仅获取属性和方法主体。这可以帮助减轻非常简单的方法的语法负担,从而使您的代码更简洁。

但是,无论如何,都要根据自己的判断来确定它是否适合任何给定的情况。当表达式很长或很复杂时,使用全身语法可能仍然更具可读性。

关于性能的另一种说法是,当适当使用某种语言功能时,也会出现性能问题:

现在,您可能会问,这在运行时是否会对性能产生影响?实际上,答案是否定的。这只是语法糖,可以扩展到与书写整个主体相同的IL。它并不会创建一个委托,它只是借用lambda表达式语法来简化编写导致的表达简单的机构。

(重点,作者)

更新1: @JörgWMittag说

这是没有道理的。“将其限制为简单的表达式和语句”???它甚至不适用于语句,仅适用于表达式!

看来原作者可能有误会。从新的和改进的C#6.0中进行澄清:

表达式合并函数是C#6.0中的另一种语法简化。这些是没有语句主体的函数。而是在函数声明后使用表达式来实现它们。

需要明确的是,这并不会使方法或属性成为Expression。它利用Expression 语法来减少代码行(和花括号的数量)。

我最初的建议仍然存在:在使代码清晰易懂时使用它,不仅仅是因为可以使用它。


2
这是没有道理的。“将其限制为简单的表达式和语句 ”???它不”,即使工作与报表,只能用表情!我也不相信添加混乱(两个括号和一个return关键字)会带来更大的可读性。毕竟,复杂表达仍然是完全相同的复杂表达,只是埋在句法混乱中。
约尔格W¯¯米塔格

3
从我读过的内容来看,身体强壮的成员实际上并不是表达式。它们是语法糖。除非自博客发布以来C#规范已更改,否则它确实支持具有无效返回类型的方法。
格雷格·伯格哈特

1
我可能是错的,但我认为Expression Statements中不允许有副作用。所以对我来说,表达式语句的好处是您告诉读者这种“表达式”是纯净的,并且读者没有需要寻找的隐藏副作用。
约翰·约翰(John John)

1
@John“不允许”完全错误。您可以在动作声明集中的成员变量内执行所有的恶作剧,例如创建动作,然后调用该动作。因此,显然不允许副作用。我绝对会劝阻他们,因为他们错过了表达语法的要点。
马菲

@Mafii。谢谢。从那以后,我了解到您可以执行“表达式语句”,这被描述为“现代”。然而,对我而言,这个想法只是令人困惑。
约翰·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.