Когда следует использовать только чтение и получать только свойства


в приложении .NET, когда я должен использовать свойства " только для чтения "и когда я должен использовать только"Get". В чем разница между этими двумя.

private readonly double Fuel= 0;

public double FuelConsumption
{
    get
    {
        return Fuel;
    }
}        

или

private double Fuel= 0;

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

5 ответов:

создание свойства только с помощью геттера делает ваше свойство доступным только для чтения для любого кода, который находится вне класса.

вы можете изменить значение с помощью методов, предоставляемых класс :
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".

Если вам нужно сохранить значение, которое никогда не изменится, как только его начальное значение было установлено, используйте

свойство, которое имеет только геттер, называется только для чтения. Причина не предусмотрен сеттер, чтобы изменить значение свойства (извне).

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

начиная с C# 6 вы можете объявить и инициализировать "авто-свойство только для чтения" в одной строке:

double FuelConsumption { get; } = 2;

вы можете установить значение из конструктора, но не другие методы.

свойства только для чтения используются для создания отказоустойчивого кода. мне очень нравится серия сообщений инкапсуляции Mark Seemann о свойствах и резервных полях:

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 устанавливается только один раз (неизменяемый) и всегда присутствует.

методы предполагают, что что-то должно произойти, чтобы вернуть значение, свойства предполагают, что значение уже есть. Это эмпирическое правило, иногда вам может понадобиться свойство, которое немного работает (т. е. Count), но в целом это полезный способ решить.