正如标题:之间有什么区别:没有setter的readonly和prop有什么区别?
private readonly string name = "ourName";
和
private string name { get { return "ourName" } }
正如标题:之间有什么区别:没有setter的readonly和prop有什么区别?
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"; } }
}
只读字段可以初始化/在构造函数中。 属性设置只得到这样的功能的作品。不能在普通情况下,设定
一个readonly
场可以通过构造函数赋值。的属性没有set
方法无法分配给任何东西。
这是一个字段声明只能申报期间设置:
readonly string name = "abc";
或类的构造函数里面。
另一方面,属性就像方法中的语法糖。 (即获得是对的getFoo()和集是setFoo(对象的值)
所以以下行实际上是编译成一个单一的方法:
string name { get { return "xyz"; } }
这就是为什么你不能使用属性值到out
或ref
参数
此外,如果您使用反射或序列化,它将表现不同,即:GetProperties()方法不会返回第一种情况下的字段,并且该字段不会在最后一个序列化一个
这是理由t优雅,比MSDN更好解释@ [MSDN](http://msdn.microsoft.com/en-us/library/acdd6hb7(v = vs.71).aspx) – dekdev 2013-05-03 20:52:02