什么时候应该使用Readonly和Get only属性

在.NET应用程序中,何时应该使用“ReadOnly”属性,何时应该只使用“Get”。 这两者有什么区别?

private readonly double Fuel= 0; public double FuelConsumption { get { return Fuel; } } 

要么

 private double Fuel= 0; public double FuelConsumption { get { return Fuel; } } 

仅使用getter创build一个属性会使您的属性只读为类外部的任何代码。

但是,您可以使用您的课程提供的方法更改值:

 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类字段通常用于在类构造期间初始化的variables,并且以后不会再进行更改。

简而言之,如果你需要确保你的属性值永远不会从外部改变, 你需要能够从你的类代码中改变它,使用“Get-only”属性。

如果您需要存储一个设置了初始值后永远不会改变的值,请使用readonly字段。

据说只有一个吸气剂的属性是只读的。 因为没有提供setter,所以改变属性的值(从外面)。

C#有一个只读关键字,可以在字段(而不是属性)上使用。 标记为“只读”的字段只能在构造对象的过程中设置一次(在构造函数中)。

 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; } } 

只读属性用于创build故障安全代码。 我非常喜欢Mark Seemann关于属性和支持字段的封装post系列:

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; } } 

在这个例子中你使用readonly name字段来确保类不变总是有效的。 在这种情况下,类composer php希望确保名称字段只设置一​​次(不可变),并始终存在。

方法build议某事必须发生返回价值,属性表明价值已经在那里。 这是一个经验法则,有时你可能想要一个属性,做一些工作(即Count ),但通常这是一个有用的方式来决定。

从C#6开始,您可以在一行中声明并初始化一个“只读自动属性”:

 double FuelConsumption { get; } = 2; 

您可以从构造函数中设置值,但不能使用其他方法。