代码之家  ›  专栏  ›  技术社区  ›  Unbreakable

使用lambda表达式声明变量和使用=运算符声明变量有什么区别

c#
  •  0
  • Unbreakable  · 技术社区  · 7 年前

    我有一个非常基本的问题,用lamda和using声明变量有什么不同 = 操作员。

      public static string ID => "RETAILER_ID";
      public static string ID = "RETAILER_ID";
    

    我肯定有人会这么问的,但我找不到。

    3 回复  |  直到 7 年前
        1
  •  4
  •   Jonathon Chase    7 年前

    第一个例子和第二个例子实际上是完全不同的。

    在第一种情况下, public static string ID => "RETAILER_ID"; 表示静态表达式体的只读自动属性。

    第二个案例, public static string ID = "RETAILER_ID"; 是静态字段,因此该值是可变的。

    在下面的类foo中,我们可以显示两者之间的一些区别,我还将添加只读的auto属性。

    public class Foo {
        public static string ExpressionBody => "ExpressionBody";
        public static string StaticField = "StaticField";
        public static string ReadOnlyProperty {get;} = "ReadOnlyProperty";
    }
    

    任何时候你提到 Foo.ExpressionBody ,将计算表达式。当这只是返回一个常量值时,这是不明显的,但是如果您使用的是函数的结果,则返回的值可能每次都不同。这与 ReadOnlyProperty ,只设置一次值。对于静态值,这将在使用类型或调用其静态构造函数之前的某个时刻完成。对于实例属性,它将在对象构造时完成。

    StaticField 另一方面,就是这样。静态字段。它在使用之前的某个时间初始化,在调用静态构造函数之前的某个时间初始化,并且它的值不能保证保持不变。IE Foo.StaticField = "NewValue!" 完全有效,并将更改值。这通常应该避免,因为它代表全局状态,并可能导致难以解释的代码。

    foo.表达体 Foo.ReadOnlyProperty 但不能分配给。 只读属性 始终是最初分配给它的值。 ExpressionBody 将始终返回表达式的结果。在这种情况下,它是恒定的“表达体”,但它也可以很容易地 DateTime.Now.ToString() ,每次使用时都会产生不同的值 foo.表达体 .

        2
  •  3
  •   bolov    7 年前
    public string ID_Property => foo();
    public string IF_Field = foo();
    

    ID_Property 是一种财产。

    • 意志评估 foo 每次读取时
    • 无法分配给
    • 它可以是接口的一部分。

    ID_Field 是一个字段

    • 任务(和评估 )只发生一次。
    • 可分配给
    • 不能是接口的一部分
        3
  •  1
  •   Joel Coehoorn    7 年前

    前者是一个 expression bodied member . 它是一个不接受输入并返回字符串结果的函数(在本例中)。在本例中,它映射只读属性(仅 get 没有 set ,以同样的方式 得到 设置 块实际上是函数。请特别注意该文档链接的属性get statements部分。

    后者是一个类字段(只是普通的字符串成员)。