2010-04-27 51 views
74

在.NET應用程序中何時應該使用「ReadOnly」屬性以及何時應該只使用「Get」。這兩者有什麼區別。什麼時候應該使用Readonly並獲取屬性

private readonly double Fuel= 0; 

public double FuelConsumption 
{ 
    get 
    { 
     return Fuel; 
    } 
}   

private double Fuel= 0; 

public double FuelConsumption 
{ 
    get 
    { 
      return Fuel; 
    } 
} 
+5

對於C#> 5代碼示例中get屬性可以簡化爲'public double FuelConsumption => Fuel;' – meJustAndrew 2017-01-03 13:16:48

回答

88

僅使用getter創建屬性會使您的屬性爲只讀類之外的任何代碼的只讀屬性。

你可以使用你的類提供的方法但更改值:

public class FuelConsumption { 
    private double fuel; 
    public double Fuel 
    { 
     get { return this.fuel; } 
    } 
    public void FillFuelTank(double amount) 
    { 
     this.fuel += amount; 
    } 
} 

public static void Main() 
{ 
    FuelConsumption f = new FuelConsumption(); 

    double a; 
    a = f.Fuel; // Will work 
    f.Fuel = a; // Does not compile 

    f.FillFuelTank(10); // Value is changed from the method's code 
} 

設置你的類的私有字段爲readonly允許您設置字段值只有一次(使用內聯轉讓或類構造函數)。 稍後您將無法更改。

public class ReadOnlyFields { 
    private readonly double a = 2.0; 
    private readonly double b; 

    public ReadOnlyFields() 
    { 
     this.b = 4.0; 
    } 
} 

readonly類字段通常用於那些一流的施工過程中初始化的變量,並且永遠不會在以後更改。

總之,如果您需要確保您的財產價值永遠不會從外部改變,您需要能夠從您的班級代碼內部更改它,使用「Get-only」屬性。

如果您需要存儲一個設置了初始值後永遠不會更改的值,請使用readonly字段。

+9

+ 1。但是需要說明的是,只有當類包裝在類字段上時,才能通過類方法修改「只讀」屬性。如果設置者不在那裏,即使通過類方法也不能直接修改它們。並試圖這樣做會導致編譯器錯誤。 – 2013-03-25 07:47:44

0

方法表明有些事情發生在返回值,屬性建議值已經存在。這是一條經驗法則,有時候您可能需要一個能做一點工作的財產(即Count),但通常這是一個有用的決定方式。

6

只有一個吸氣劑的屬性據說是只讀的。因爲沒有提供setter,所以要更改該屬性的值(從外部)。

C#有一個關鍵字readonly,可用於字段(非屬性)。標記爲「只讀」的字段只能在構造對象的過程中(在構造函數中)設置一次。

private string _name = "Foo"; // field for property Name; 
private bool _enabled = false; // field for property Enabled; 

public string Name{ // This is a readonly property. 
    get { 
    return _name; 
    } 
} 

public bool Enabled{ // This is a read- and writeable property. 
    get{ 
    return _enabled; 
    } 
    set{ 
    _enabled = value; 
    } 
} 
1

只讀屬性用於創建故障安全代碼。 我真的很喜歡的屬性和支持字段的封裝職位系列馬克西曼的:

http://blog.ploeh.dk/2011/05/24/PokayokeDesignFromSmellToFragrance.aspx

馬克的榜樣採取:

public class Fragrance : IFragrance 
{ 
    private readonly string name; 

    public Fragrance(string name) 
    { 
     if (name == null) 
     { 
      throw new ArgumentNullException("name"); 
     } 

     this.name = name; 
    } 

    public string Spread() 
    { 
     return this.name; 
    } 
} 

在這個例子中,你使用只讀name字段,以確保類不變總是有效的。在這種情況下,類作曲家希望確保名稱字段只設置一​​次(不可變)並始終存在。

3

As of C# 6你可以聲明,並在同一行初始化一個「只讀自動屬性」:

double FuelConsumption { get; } = 2; 

您可以設置從構造的價值而不是其他的方法。

相關問題