[英]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.ExpressionBody
和Foo.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
),就像属性get
和set
块实际上是函数一样。 请特别注意该文档链接的“属性获取语句”部分。
后者是一个类字段(只是一个普通的字符串成员)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.