2013-05-03 94 views

回答

6

第一個版本是對象的狀態的一部分 - 它只是一個領域。它仍然可以在構造函數體內進行更改。

第二個版本是只是一個屬性 - 它實際上是一種方法,每次調用它時都會返回相同的值,並且不是對象狀態的真正部分。 (沒有涉及的領域。)

+0

這是理由t優雅,比MSDN更好解釋@ [MSDN](http://msdn.microsoft.com/en-us/library/acdd6hb7(v = vs.71).aspx) – dekdev 2013-05-03 20:52:02

2

第一個是字段。第二個是財產。該字段將值「ourName」保存爲本地狀態。該屬性提供了一種無狀態訪問文字「ourName」的方法。

您可以設置字段並在構造函數中改變字段的狀態。您還可以將該字段傳遞給構造函數中方法的refout參數。

這些陳述都不屬實。你所能做的就是讀取通過調用底層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"; } } 
} 
0

只讀字段可以初始化/在構造函數中。 屬性設置只得到這樣的功能的作品。不能在普通情況下,設定

0

一個readonly場可以通過構造函數賦值。的屬性沒有set方法無法分配給任何東西。

0

這是一個字段聲明只能申報期間設置:

readonly string name = "abc"; 

或類的構造函數裏面。

另一方面,屬性就像方法中的語法糖。 (即獲得是對的getFoo()和集是setFoo(對象的值)

所以以下行實際上是編譯成一個單一的方法:

string name { get { return "xyz"; } } 

這就是爲什麼你不能使用屬性值到outref參數

1

此外,如果您使用反射或序列化,它將表現不同,即:GetProperties()方法不會返回第一種情況下的字段,並且該字段不會在最後一個序列化一個