【问题标题】:What is the benefit of using "Expression Bodied Functions and Properties" [duplicate]使用“表达式体函数和属性”有什么好处 [重复]
【发布时间】:2017-03-12 07:28:26
【问题描述】:

我确实看到很多人在使用这个新功能,但是使用这些表达式有什么好处呢?

Examples:

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

public string Text =>
string.Format("{0}: {1} - {2} ({3})", TimeStamp, Process, Config, User);

这个问题和this one不一样,因为我问的不仅仅是性能和效率有没有变化,还有编译后的代码(IL代码)的区别,是否是最佳实践,应该用在现实世界。

这个问题也不是off topic,因为我要求的是真实的企业经验,而不是建议。因此不推荐,但请说明您为什么会或为什么不使用该功能以及您使用该功能的经验!

【问题讨论】:

  • 简洁。写同样的东西,但更短。它允许开发者省略大括号和 return 语句。
  • 可读性?紧凑?自动属性有什么好处?
  • 有趣的方法。它还提供性能增强功能吗?
  • 关于性能和生成的 IL 的差异,请参阅链接问题:相同。至于它是否是好的做法,或者使用它有什么好处;这是一个主观意见(因此偏离主题)。使用它,如果你喜欢它,不要使用它,如果你不喜欢它。它更短,所以对于许多人来说已经足够了。但我个人会避免使用它,因为涉及的表达式会变得更长或更复杂。

标签: c# c#-6.0


【解决方案1】:

它提供了更好的可读性并节省了一些代码空间。它只是更好。

【讨论】:

  • 这是关于使用这些表达式的好处的简短而好的答案。加 1 !
  • 尽管它使方法更简洁,但我发现扩展的方法声明更易于肉眼理解,因为它们在类成员之间保持一致的缩进。
【解决方案2】:

回答我的一个问题。我已经测试了,如果 IL 代码与以下结果相同:

static void Main(string[] args)
{
    Console.WriteLine(MyClass.GetTexted);
}

class MyClass
{
    private static string dontTouchMe = "test";

    public static string GetTexted { get { return dontTouchMe + "1"; } }

    //public static string GetTexted => dontTouchMe + "1";
}

... 将生成相同的 IL 代码:

00993376  call        [random value]
0099337B  mov         dword ptr [ebp-40h],eax  
0099337E  mov         ecx,dword ptr [ebp-40h]  
00993381  call        71886640  
00993386  nop  
        }
00993387  nop  
00993388  lea         esp,[ebp-0Ch]  
0099338B  pop         ebx  
0099338C  pop         esi  
0099338D  pop         edi  
0099338E  pop         ebp  
0099338F  ret  

[random value] 部分是唯一更改的代码,这确实有意义,因为它每次编译时都会更改。


我还是在校学生,所以只能从自己的角度回答其他问题(不是企业视角):

  • “表达式体函数和属性”看起来确实是一种很好的做法,因为它的代码更加紧凑和可读。 (感谢@Wazner@MacakM

  • 使用它们也很有意义,因为它们看起来更模块化,更像 OOP 代码

【讨论】:

    【解决方案3】:

    主体表达式仅提供了一种简洁明了的方式来声明只读属性。
    从性能的角度来看,您可以这样写:

    public bool MyProperty {
        get {
            return myMethod();
        }
    }
    
    private bool myMethod() {return true;}
    

    或者这个:

    public bool MyProperty => myMethod();
    private bool myMethod() {return true;}
    

    没有区别,因为它以相同的方式翻译成IL
    但请注意:body 表达式是 Visual Studio 2015 及更新版本默认提供的功能,但如果您想在旧 VS 版本中使用,则需要从 NuGet 安装 C# 6.0。

    【讨论】:

    • 其他 Visual Studio IDE 也支持 c# 6.0:stackoverflow.com/questions/28638547/…
    • 你也可以在方法声明中使用 Expression-body public bool MyProperty => myMethod(); private bool myMethod() => true;
    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2014-07-21
    相关资源
    最近更新 更多