在获取属性中使用的表达式主体函数成员

4

编写类时,可以通过两种方式在 Get 属性中使用表达式体函数:

class Person
{
    public string FirstName {get; set;}
    public string LastName {get; set;}

   public string FullName1 => $"{FirstName} {LastName}";
   public string FullName2 { get => $"{FirstName} {LastName}"; }
}

关于表达式主体函数成员的内容,请参考MSDN 链接

你也可以在只读属性中使用表达式主体成员:

public string FullName => $"{FirstName} {LastName}";

如果这个语法表示了一个获取属性的实现,那第二个语法是什么意思?有什么区别?哪一个更受欢迎?

3个回答

3

这两个是相同的。它们编译成相同的代码:

Person.get_FullName1:
IL_0000:  ldstr       "{0} {1}"
IL_0005:  ldarg.0     
IL_0006:  call        UserQuery+Person.get_FirstName
IL_000B:  ldarg.0     
IL_000C:  call        UserQuery+Person.get_LastName
IL_0011:  call        System.String.Format
IL_0016:  ret         

Person.get_FullName2:
IL_0000:  ldstr       "{0} {1}"
IL_0005:  ldarg.0     
IL_0006:  call        UserQuery+Person.get_FirstName
IL_000B:  ldarg.0     
IL_000C:  call        UserQuery+Person.get_LastName
IL_0011:  call        System.String.Format
IL_0016:  ret         

只是一种不同的符号表示法,让你可以在相同格式中提供set


我没有点踩...这个IL清楚地显示两种方法返回相同的结果。我担心没有Get的方法会初始化一个字段,但是这个IL表明没有Get的版本也调用了Get。 - Harald Coppoolse
@HaraldCoppoolse 不在意负面评价 - “虚假的网络积分”我已经有足够多了 :-). 很高兴这个回答直接解决了你的问题。 - trailmax

2

这关乎风格和可读性。

{ get => $"{FirstName} {LastName}"; } 的主要优点是您可以将其与 set {...} 结合使用。


1
当您在读写属性中使用表达式主体成员时,它看起来像这样:
public string Property {
    get => field;
    set => field = value;
}

即使您删除setter,也可以接受此语法是很自然的事情,拒绝它需要额外的努力,并且允许它并不会有任何危害。 短形式public string Property => field;意思完全相同,您可以自由选择喜欢的形式。

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