Kapan sebaiknya menggunakan properti Readonly dan Get only

100

Dalam aplikasi .NET, kapan saya harus menggunakan properti "ReadOnly" dan kapan saya harus menggunakan "Get" saja. Apa perbedaan antara keduanya.

private readonly double Fuel= 0;

public double FuelConsumption
{
    get
    {
        return Fuel;
    }
}        

atau

private double Fuel= 0;

public double FuelConsumption
{
     get
     {
          return Fuel;
     }
}
Ram
sumber
12
untuk C #> 5 properti get dapat dikurangi menjadipublic double FuelConsumption => Fuel;
meJustAndrew

Jawaban:

121

Membuat properti hanya dengan getter membuat properti Anda menjadi hanya-baca untuk kode apa pun yang ada di luar kelas.

Namun Anda dapat mengubah nilai menggunakan metode yang disediakan oleh kelas Anda:

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
}

Menyetel bidang privat kelas readonlyAnda memungkinkan Anda menyetel nilai bidang hanya sekali (menggunakan tugas sebaris atau di konstruktor kelas). Anda tidak akan dapat mengubahnya nanti.

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

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

readonly bidang kelas sering digunakan untuk variabel yang diinisialisasi selama konstruksi kelas, dan tidak akan pernah diubah nanti.

Singkatnya, jika Anda perlu memastikan nilai properti Anda tidak akan pernah berubah dari luar, tetapi Anda harus bisa mengubahnya dari dalam kode kelas Anda, gunakan properti "Get-only".

Jika Anda perlu menyimpan nilai yang tidak akan pernah berubah setelah nilai awalnya ditetapkan, gunakan readonlybidang.

Thibault Falise
sumber
14
+1 untuk contoh kode. Tapi perlu memperjelas bahwa properti "Get-Only" hanya dapat dimodifikasi dengan metode kelas ketika mereka digabungkan pada field kelas. Mereka tidak dapat diubah secara langsung bahkan oleh metode kelas, jika penyetel tidak ada. Dan mencoba melakukannya akan menghasilkan kesalahan kompiler.
Devraj Gadhavi
13

Mulai C # 6 Anda bisa mendeklarasikan dan menginisialisasi 'read-only auto-property' dalam satu baris:

double FuelConsumption { get; } = 2;

Anda dapat menyetel nilai dari konstruktor tetapi tidak dari metode lain.

Kolonel Panik
sumber
7

Properti yang hanya memiliki pengambil dikatakan hanya untuk dibaca. Penyebab tidak ada penyetel disediakan, untuk mengubah nilai properti (dari luar).

C # memiliki kata kunci readonly , yang dapat digunakan pada field (bukan properti). Bidang yang ditandai sebagai "hanya baca", hanya dapat disetel sekali selama konstruksi objek (dalam konstruktor).

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;
  }
} 
Jehof
sumber
2

properti readonly digunakan untuk membuat kode gagal-aman. Saya sangat suka seri posting Enkapsulasi Mark Seemann tentang properti dan bidang dukungan:

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

diambil dari contoh Mark:

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

dalam contoh ini, Anda menggunakan kolom nama hanya baca untuk memastikan invarian kelas selalu valid. dalam hal ini komposer kelas ingin memastikan field name disetel hanya sekali (tidak dapat diubah) dan selalu ada.

danfromisrael
sumber
0

Metode menyarankan sesuatu harus terjadi untuk mengembalikan nilai, properti menyarankan bahwa nilai sudah ada. Ini adalah aturan praktis, terkadang Anda mungkin menginginkan properti yang berfungsi sedikit (mis. Count), Tetapi umumnya ini adalah cara yang berguna untuk memutuskan.

Neil Barnwell
sumber