繁体   English   中英

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

[英]What is the difference between declaring a variable using Lambda expression and using = operator

我有一个非常基本的问题,使用Lamda和=运算符声明变量有什么区别。

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

我相信有人会在SO中提出这个问题,但我找不到。

第一个示例和第二个示例实际上完全不同。

在第一种情况下, 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就是这样。 静态字段。 它在使用前的某个时候被初始化,在静态构造函数被调用之前的某个时候被初始化,并且它的值不能保证保持不变。 即, Foo.StaticField = "NewValue!" 是完全有效的,并且会更改值。 通常应避免这种情况,因为它代表全局状态,并且可能导致难以理解的代码。

Foo.ExpressionBody ,不能将Foo.ExpressionBodyFoo.ReadOnlyProperty分配给它。 ReadOnlyProperty将始终是最初为其分配的值。 ExpressionBody将始终返回ExpressionBody的结果。 在这种情况下,它是常量“ ExpressionBody”,但也很可能是DateTime.Now.ToString() ,每次您使用Foo.ExpressionBody时,它都会导致一个不同的值。

public string ID_Property => foo();
public string IF_Field = foo();

ID_Property是一个属性。

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

ID_Field是一个字段

  • 赋值(和foo求值)仅发生一次。
  • 可以分配给
  • 不能是接口的一部分

前者是一个表达体的成员 这个函数(在这种情况下)不接受任何输入并返回字符串结果。 在这种情况下,它映射一个只读属性(只是一个get ,没有set ),就像属性getset块实际上是函数一样。 请特别注意该文档链接的“属性获取语句”部分。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM