Salt Okunur ve Yalnızca Al özellikleri ne zaman kullanılmalıdır?


100

Bir .NET uygulamasında "ReadOnly" özelliklerini ne zaman kullanmalıyım ve ne zaman sadece "Get" kullanmalıyım. Bu ikisi arasındaki fark nedir.

private readonly double Fuel= 0;

public double FuelConsumption
{
    get
    {
        return Fuel;
    }
}        

veya

private double Fuel= 0;

public double FuelConsumption
{
     get
     {
          return Fuel;
     }
}

12
C #> 5 için get özelliği azaltılabilirpublic double FuelConsumption => Fuel;
meJustAndrew

Yanıtlar:


122

Yalnızca alıcıyla bir mülk oluşturmak, mülkünüzü sınıfın dışındaki herhangi bir kod için salt okunur hale getirir.

Bununla birlikte, sınıfınız tarafından sağlanan yöntemleri kullanarak değeri değiştirebilirsiniz:

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
}

Sınıfınızın özel alanını olarak readonlyayarlamak, alan değerini yalnızca bir kez ayarlamanıza izin verir (bir satır içi atama kullanarak veya sınıf yapıcısında). Daha sonra değiştiremeyeceksiniz.

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

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

readonly sınıf alanları genellikle sınıf oluşturma sırasında başlatılan değişkenler için kullanılır ve daha sonra asla değiştirilmeyecektir.

Kısacası, mülk değerinizin asla dışarıdan değiştirilmeyeceğinden emin olmanız gerekiyorsa, ancak bunu sınıf kodunuzun içinden değiştirebilmeniz gerekiyorsa, bir "Get-only" özelliği kullanın.

Başlangıç ​​değeri ayarlandıktan sonra asla değişmeyecek bir değer kaydetmeniz gerekiyorsa, bir readonlyalan kullanın .


14
Kod örneği için + 1. Ancak, "Get-Only" özelliklerinin yalnızca sınıf yöntemleri tarafından sınıf alanlarına sarıldığında değiştirilebileceğinin açıklığa kavuşturulması gerekir. Ayarlayıcı orada değilse, sınıf yöntemleri tarafından bile doğrudan değiştirilemezler. Ve bunu yapmaya çalışmak bir derleyici hatasıyla sonuçlanır.
Devraj Gadhavi

13

C # 6'dan itibaren bir satırda 'salt okunur bir otomatik özellik' bildirebilir ve başlatabilirsiniz:

double FuelConsumption { get; } = 2;

Değeri yapıcıdan ayarlayabilirsiniz ancak diğer yöntemlerden ayarlayamazsınız.


7

Yalnızca alıcıya sahip bir mülkün salt okunur olduğu söylenir. Özelliğin değerini (dışarıdan) değiştirmek için ayarlayıcı sağlanmadığından.

C #, alanlarda kullanılabilen (özelliklerde değil) salt okunur bir anahtar kelimeye sahiptir . "Salt okunur" olarak işaretlenen bir alan, yalnızca bir nesnenin oluşturulması sırasında (yapıcıda) bir kez ayarlanabilir.

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

salt okunur özellikleri, hata korumalı bir kod oluşturmak için kullanılır. Mark Seemann'ın özellikler ve destek alanları hakkındaki Encapsulation gönderileri serisini gerçekten seviyorum:

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

Mark'ın örneğinden alınmıştır:

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

bu örnekte, sınıf değişmezinin her zaman geçerli olduğundan emin olmak için salt okunur ad alanını kullanırsınız. bu durumda sınıf oluşturucu, ad alanının yalnızca bir kez (değişmez) ayarlandığından ve her zaman mevcut olduğundan emin olmak istedi.


0

Yöntemler, değeri döndürmek için bir şeyin olması gerektiğini önerir, özellikler değerin zaten orada olduğunu gösterir. Bu pratik bir kuraldır, bazen biraz iş yapan (yani Count) bir mülk isteyebilirsiniz , ancak genellikle karar vermek için yararlı bir yoldur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.