正如標題:之間有什麼區別:沒有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