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

Ram*_*Ram 93 .net c#

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

private readonly double Fuel= 0;

public double FuelConsumption
{
    get
    {
        return Fuel;
    }
}        
Run Code Online (Sandbox Code Playgroud)

要么

private double Fuel= 0;

public double FuelConsumption
{
     get
     {
          return Fuel;
     }
}
Run Code Online (Sandbox Code Playgroud)

Thi*_*ise 112

仅使用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
}
Run Code Online (Sandbox Code Playgroud)

将类的私有字段设置为readonly允许您只设置一次字段值(使用内联赋值或在类构造函数中).您将无法在以后更改它.

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

    public ReadOnlyFields()
    {
        this.b = 4.0;
    }
}
Run Code Online (Sandbox Code Playgroud)

readonly 类字段通常用于在类构造期间初始化的变量,并且以后永远不会更改.

简而言之,如果您需要确保您的属性值永远不会从外部更改,您需要能够从类代码中更改它,请使用"Get-only"属性.

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

  • 代码示例为+ 1.但需要明确的是,"Get-Only"属性只能在类方法包装时才能通过类方法进行修改.如果没有setter,它们甚至不能通过类方法直接修改.尝试这样做会导致编译器错误. (12认同)

Col*_*nic 12

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

double FuelConsumption { get; } = 2;
Run Code Online (Sandbox Code Playgroud)

您可以从构造函数设置值,但不能设置其他方法.


Jeh*_*hof 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;
  }
} 
Run Code Online (Sandbox Code Playgroud)