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 atauinit
penganalisis. - Properti dapat berupa baca-tulis (properti memiliki pengakses
get
danset
), baca-saja (memiliki pengaksesget
tetapi tidak memiliki pengaksesset
), atau tulis-saja (memiliki pengaksesset
, tetapi tidak memiliki pengaksesget
). 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 get
set
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}");
Bagian terkait
- Menggunakan Properti
- Properti Antarmuka
- Perbandingan Antara Properti dan Pengindeks
- Membatasi Aksesibilitas Pengakses
- Properti yang Diterapkan Secara Otomatis
Spesifikasi Bahasa C#
Untuk informasi selengkapnya, lihat Properti di Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk