代码之家  ›  专栏  ›  技术社区  ›  Harald Coppoolse

get属性中使用的表达式体函数成员

  •  4
  • Harald Coppoolse  · 技术社区  · 6 年前

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

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

    关于MSDN expression bodied function members

    也可以在只读属性中使用表达式体成员作为 好:

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

    因此,如果这个语法表示get属性的实现,那么第二个语法是什么意思?有什么区别?一个优先于另一个吗?

    3 回复  |  直到 6 年前
        1
  •  3
  •   trailmax    6 年前

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

    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 格式相同。

        2
  •  2
  •   bommelding    6 年前

    这是一个风格和可读性的问题。

    的主要优势 { get => $"{FirstName} {LastName}"; } 你可以把它和 set {...} .

        3
  •  1
  •   user743382    6 年前

    当使用具有读写属性的表达式体成员时,它看起来像

    public string Property {
        get => field;
        set => field = value;
    }
    

    即使删除setter,这种语法也是可以接受的,这是很自然的,要拒绝它需要付出额外的努力,并且允许它也没有任何危害。短格式 public string Property => field; 意思完全一样,你可以自由选择你喜欢的形式。