Properti (Panduan Pemrograman C#)

Properti adalah anggota yang menyediakan mekanisme fleksibel untuk membaca, menulis, atau menghitung nilai bidang privat. Properti dapat digunakan seolah-olah mereka adalah anggota data publik, tetapi merupakan metode khusus yang disebut aksesor. Fitur ini memungkinkan data diakses dengan mudah dan masih membantu mempromosikan keamanan dan fleksibilitas metode.

Gambaran umum properti

  • Properti memungkinkan kelas memperlihatkan cara publik untuk mendapatkan dan menetapkan nilai, sambil menyembunyikan kode penerapan atau verifikasi.
  • Pengakses properti get digunakan untuk mengembalikan nilai properti, dan pengakses properti set digunakan untuk menetapkan nilai baru. Aksesor properti init digunakan untuk menetapkan nilai baru hanya selama konstruksi objek. Pengakses ini dapat memiliki tingkat akses yang berbeda. Untuk informasi selengkapnya, lihat Membatasi Aksesibilitas Pengakses.
  • Kata kunci nilai digunakan untuk menentukan nilai yang set ditetapkan atau init penganalisis.
  • Properti dapat berupa baca-tulis (properti memiliki pengakses get dan set), baca-saja (memiliki pengakses get tetapi tidak memiliki pengakses set), atau tulis-saja (memiliki pengakses set, tetapi tidak memiliki pengakses get). Properti tulis-saja jarang terjadi dan paling sering digunakan untuk membatasi akses ke data sensitif.
  • Properti sederhana yang tidak memerlukan kode pengakses kustom dapat diterapkan baik sebagai definisi isi ekspresi atau sebagai properti yang diterapkan secara otomatis.

Properti dengan bidang pendukung

Salah satu pola dasar untuk menerapkan properti melibatkan penggunaan bidang pendukung privat untuk menetapkan dan mengambil nilai properti. Pengakses get mengembalikan nilai bidang privat, dan pengakses set dapat melakukan beberapa validasi data sebelum menetapkan nilai ke bidang privat. Kedua aksesor juga dapat melakukan beberapa konversi atau komputasi pada data sebelum disimpan atau dikembalikan.

Contoh berikut menggambarkan pola ini. Dalam contoh ini, kelas TimePeriod mewakili interval waktu. Secara internal, kelas menyimpan interval waktu dalam detik di bidang privat bernama _seconds. Properti baca-tulis bernama Hours memungkinkan pelanggan menentukan interval waktu dalam jam. Pengakses get dan set melakukan konversi yang diperlukan antara jam dan detik. Selain itu, pengakses set memvalidasi data dan menampilkan ArgumentOutOfRangeException jika jumlah jam tidak valid.

public class TimePeriod
{
    private double _seconds;

    public double Hours
    {
        get { return _seconds / 3600; }
        set
        {
            if (value < 0 || value > 24)
                throw new ArgumentOutOfRangeException(nameof(value),
                      "The valid range is between 0 and 24.");

            _seconds = value * 3600;
        }
    }
}

Anda dapat mengakses properti untuk mendapatkan dan mengatur nilai seperti yang ditunjukkan dalam contoh berikut:

TimePeriod t = new TimePeriod();
// The property assignment causes the 'set' accessor to be called.
t.Hours = 24;

// Retrieving the property causes the 'get' accessor to be called.
Console.WriteLine($"Time in hours: {t.Hours}");
// The example displays the following output:
//    Time in hours: 24

Definisi isi ekspresi

Pengakses properti sering kali terdiri dari pernyataan satu baris yang hanya menetapkan atau mengembalikan hasil ekspresi. Anda dapat menerapkan properti ini sebagai anggota berisi ekspresi. Definisi isi ekspresi terdiri dari simbol => diikuti oleh ekspresi untuk ditetapkan atau diambil dari properti.

Properti baca-saja dapat mengimplementasikan get aksesor sebagai anggota bertubuh ekspresi. Dalam hal ini, baik kata kunci pengakses get maupun kata kunci return tidak digunakan. Contoh berikut menerapkan properti Name baca-saja sebagai anggota berisi ekspresi.

public class Person
{
    private string _firstName;
    private string _lastName;

    public Person(string first, string last)
    {
        _firstName = first;
        _lastName = last;
    }

    public string Name => $"{_firstName} {_lastName}";
}

Baik dan getset pengakses dapat diimplementasikan sebagai anggota bertubuh ekspresi. Dalam hal ini, kata kunci get dan set harus ada. Contoh berikut menggambarkan penggunaan definisi isi ekspresi untuk kedua pengakses. Kata return kunci tidak digunakan dengan get aksesor.

public class SaleItem
{
    string _name;
    decimal _cost;

    public SaleItem(string name, decimal cost)
    {
        _name = name;
        _cost = cost;
    }

    public string Name
    {
        get => _name;
        set => _name = value;
    }

    public decimal Price
    {
        get => _cost;
        set => _cost = value;
    }
}

Properti yang dapat diterapkan secara otomatis

Dalam beberapa kasus, properti get dan set aksesor hanya menetapkan nilai ke atau mengambil nilai dari bidang dukungan tanpa menyertakan logika tambahan. Dengan menggunakan properti yang diterapkan secara otomatis, Anda dapat menyederhanakan kode Anda sementara kompilator C# secara transparan menyediakan bidang dukungan untuk Anda.

Jika properti memiliki pengakses get dan set (atau get dan init), keduanya harus diterapkan secara otomatis. Anda menentukan properti yang diterapkan secara otomatis dengan menggunakan kata kunci get dan set tanpa memberikan penerapan apa pun. Contoh berikut mengulangi yang sebelumnya, kecuali bahwa Name dan Price adalah properti yang diterapkan secara otomatis. Contoh ini juga menghapus konstruktor berparameter, sehingga objek SaleItem sekarang diinisialisasi dengan panggilan ke konstruktor tanpa parameter dan penginisialisasi objek.

public class SaleItem
{
    public string Name
    { get; set; }

    public decimal Price
    { get; set; }
}

Properti yang diterapkan secara otomatis dapat mendeklarasikan aksesibilitas yang berbeda untuk get pengakses dan set . Anda biasanya mendeklarasikan aksesor publik get dan aksesor privat set . Anda dapat mempelajari selengkapnya dalam artikel tentang membatasi aksesibilitas aksesor.

Properti yang diperlukan

Dimulai dengan C# 11, Anda dapat menambahkan required anggota untuk memaksa kode klien menginisialisasi properti atau bidang apa pun:

public class SaleItem
{
    public required string Name
    { get; set; }

    public required decimal Price
    { get; set; }
}

Untuk membuat SaleItem, Anda harus mengatur Name properti dan Price menggunakan penginisialisasi objek, seperti yang ditunjukkan dalam kode berikut:

var item = new SaleItem { Name = "Shoes", Price = 19.95m };
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");

Spesifikasi Bahasa C#

Untuk informasi selengkapnya, lihat Properti di Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.

Lihat juga