Kiedy należy używać właściwości Tylko do odczytu i Tylko pobieranie


100

W aplikacji .NET, kiedy należy używać właściwości „ReadOnly”, a kiedy tylko „Get”. Jaka jest różnica między tymi dwoma.

private readonly double Fuel= 0;

public double FuelConsumption
{
    get
    {
        return Fuel;
    }
}        

lub

private double Fuel= 0;

public double FuelConsumption
{
     get
     {
          return Fuel;
     }
}

12
dla C #> 5 właściwość get można zredukować dopublic double FuelConsumption => Fuel;
meJustAndrew

Odpowiedzi:


121

Utworzenie właściwości tylko z funkcją pobierającą powoduje, że właściwość jest tylko do odczytu dla dowolnego kodu spoza klasy.

Możesz jednak zmienić wartość za pomocą metod dostarczonych przez twoją klasę:

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
}

Ustawienie pola prywatnego klasy jako readonlyumożliwia ustawienie wartości pola tylko raz (przy użyciu przypisania w wierszu lub w konstruktorze klasy). Nie będziesz mógł go później zmienić.

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

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

readonly pola klasy są często używane dla zmiennych, które są inicjowane podczas konstrukcji klasy i nigdy nie zostaną zmienione później.

Krótko mówiąc, jeśli chcesz mieć pewność, że wartość Twojej właściwości nigdy nie zostanie zmieniona z zewnątrz, ale musisz mieć możliwość zmiany jej wewnątrz kodu klasy, użyj właściwości „Tylko do pobrania”.

Jeśli chcesz zapisać wartość, która nigdy się nie zmieni po ustawieniu wartości początkowej, użyj readonlypola.


14
+ 1 na przykład kodu. Ale trzeba wyjaśnić, że właściwości „Tylko do pobierania” mogą być modyfikowane przez metody klasy tylko wtedy, gdy są opakowane w pola klasy. Nie można ich modyfikować bezpośrednio nawet metodami klas, jeśli nie ma setera. Próba zrobienia tego spowodowałaby błąd kompilatora.
Devraj Gadhavi,

13

Od C # 6 można zadeklarować i zainicjować „właściwość automatyczną tylko do odczytu” w jednym wierszu:

double FuelConsumption { get; } = 2;

Możesz ustawić wartość z konstruktora, ale nie inne metody.


7

Mówi się, że właściwość, która ma tylko metodę pobierającą, jest tylko do odczytu. Ponieważ nie podano metody ustawiającej, aby zmienić wartość właściwości (z zewnątrz).

C # ma słowo kluczowe readonly , które może być używane w polach (nie we właściwościach). Pole, które jest oznaczone jako „tylko do odczytu”, może być ustawione tylko raz podczas budowy obiektu (w konstruktorze).

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

właściwości tylko do odczytu są używane do tworzenia kodu odpornego na błędy. Bardzo podoba mi się seria wpisów o enkapsulacji Marka Seemanna dotycząca właściwości i pól zapasowych:

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

zaczerpnięte z przykładu Marka:

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

w tym przykładzie używasz pola tylko do odczytu, aby upewnić się, że niezmienna klasa jest zawsze poprawna. w tym przypadku twórca klasy chciał się upewnić, że pole nazwy jest ustawione tylko raz (niezmienne) i zawsze jest obecne.


0

Metody sugerują, że coś musi się wydarzyć, aby zwrócić wartość, właściwości sugerują, że wartość już istnieje. Jest to praktyczna zasada, czasami możesz potrzebować właściwości, która trochę działa (tj. Count), Ale ogólnie jest to przydatny sposób podejmowania decyzji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.