如标题:有什么区别:
private readonly string name = "ourName";
和
private string name { get { return "ourName" } }
如标题:有什么区别:
private readonly string name = "ourName";
和
private string name { get { return "ourName" } }
第一个版本是对象状态的一部分——它只是一个字段。它仍然可以在构造函数体内进行更改,也是。
第二个版本只是一个属性——它实际上是一个每次调用它都返回相同值的方法,并不是对象状态的一部分。(不涉及任何领域。)
第一个是字段。二是财产。该字段将值“ourName”保存为本地状态。该属性提供了一种无状态访问文字“ourName”的方法。
您可以在构造函数中设置字段并改变字段的状态。您还可以将字段传递给构造函数中方法的一个ref
或out
参数。
这些关于该财产的陈述均不属实。您可以对属性做的所有事情都是通过调用底层get_name()
方法读取返回的值(它总是返回相同的文字值“ourName”。此外,考虑这些示例以了解如何使用字段大小写与属性对比:
public class ExampleWithField
{
public ExampleWithField(){
this.name = "Not our name"; // the value will be "Not our name"
}
private readonly string name = "ourName";
}
public class ExampleWithFieldAndRefParam
{
public ExampleWithFieldAndRefParam(){
SetRefValue(ref this.name); // the value will be "Not our nameourName"
}
static void SetRefValue(ref string value){ value = "Not our name" + value; }
private readonly string name = "ourName";
}
public class ExampleWithFieldAndOutParam
{
public ExampleWithFieldAndOutParam(){
SetOutValue(out this.name); // the value will be "Not our name"
}
static void SetOutValue(out string value){ value = "Not our name"; }
private readonly string name = "ourName";
}
public class ExampleWithProperty
{
public ExampleWithProperty(){
this.name = "Not our name"; // this will not compile.
}
private string name { get { return "ourName"; } }
}
此外,如果您使用反射或序列化,它的行为会有所不同,即:GetProperties() 方法在第一种情况下不会返回该字段,并且该字段不会在最后一种情况下被序列化。
readonly 字段可以在构造函数中初始化/设置。只有 get 的属性像函数一样工作。一般情况下不能设置
字段可以readonly
由构造函数分配。没有方法的属性set
不能被任何东西分配。
这是一个只能在声明期间设置的字段声明:
readonly string name = "abc";
或在类构造函数内部。
另一方面,属性就像方法的语法糖。(即 get 用于 getFoo() 而 set 用于 setFoo(object value)。
所以下面这行实际上被编译成一个方法:
string name { get { return "xyz"; } }
这就是为什么您不能将属性用作值out
或ref
参数的原因