Коли слід використовувати Readonly та отримати лише властивості


100

У програмі .NET, коли я повинен використовувати властивості "ReadOnly" і коли я повинен використовувати лише "Get". Яка різниця між цими двома.

private readonly double Fuel= 0;

public double FuelConsumption
{
    get
    {
        return Fuel;
    }
}        

або

private double Fuel= 0;

public double FuelConsumption
{
     get
     {
          return Fuel;
     }
}

12
для C #> 5 майно для отримання можна зменшити доpublic double FuelConsumption => Fuel;
meJustAndrew

Відповіді:


121

Створення властивості лише за допомогою 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 поля класу часто використовуються для змінних, які ініціалізуються під час побудови класу, і вони ніколи не будуть змінені згодом.

Коротше кажучи, якщо вам потрібно переконатися, що значення вашої власності ніколи не буде змінено ззовні, але вам потрібно мати змогу змінити її всередині коду вашого класу, використовуйте властивість "Тільки для отримання".

Якщо вам потрібно зберегти значення, яке ніколи не зміниться після встановлення його початкового значення, використовуйте readonlyполе.


14
+ 1 для прикладу коду. Але потрібно уточнити, що властивості "Get-Only" можна змінювати методами класу лише тоді, коли вони загортаються на поля класу. Вони не можуть бути змінені безпосередньо навіть класовими методами, якщо сеттера немає. А спроби зробити це призведе до помилки компілятора.
Devraj Gadhavi

13

З C # 6 ви можете оголосити та ініціалізувати "власність лише для читання" в одному рядку:

double FuelConsumption { get; } = 2;

Ви можете встановити значення у конструкторі, але не іншими методами.


7

Кажуть, що власність, у якій є лише геттер, читається лише заново. Тому що не встановлено сетер для зміни вартості властивості (ззовні).

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

2

Властивості readonly використовуються для створення безвідмовного коду. мені дуже подобається серія повідомлень про інкапсуляцію Марка Семана про властивості та поля резервного копіювання:

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

у цьому прикладі ви використовуєте поле для читання тільки для того, щоб переконатися, що інваріант класу завжди дійсний. у цьому випадку композитор класу хотів переконатися, що поле імені встановлено лише один раз (незмінне) і воно завжди присутнє.


0

Методи дозволяють припустити, що щось має повернути значення, властивості припускають, що значення вже є. Це правило, іноді вам може знадобитися властивість, яка трохи працює (тобто Count), але загалом це корисний спосіб прийняти рішення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.