Dalam situasi apa saya harus menggunakan Set Pribadi pada properti versus menjadikannya properti ReadOnly? Pertimbangkan dua contoh yang sangat sederhana di bawah ini.
Contoh pertama:
Public Class Person
Private _name As String
Public Property Name As String
Get
Return _name
End Get
Private Set(ByVal value As String)
_name = value
End Set
End Property
Public Sub WorkOnName()
Dim txtInfo As TextInfo = _
Threading.Thread.CurrentThread.CurrentCulture.TextInfo
Me.Name = txtInfo.ToTitleCase(Me.Name)
End Sub
End Class
// ----------
public class Person
{
private string _name;
public string Name
{
get { return _name; }
private set { _name = value; }
}
public void WorkOnName()
{
TextInfo txtInfo = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo;
this.Name = txtInfo.ToTitleCase(this.Name);
}
}
Contoh kedua:
Public Class AnotherPerson
Private _name As String
Public ReadOnly Property Name As String
Get
Return _name
End Get
End Property
Public Sub WorkOnName()
Dim txtInfo As TextInfo = _
Threading.Thread.CurrentThread.CurrentCulture.TextInfo
_name = txtInfo.ToTitleCase(_name)
End Sub
End Class
// ---------------
public class AnotherPerson
{
private string _name;
public string Name
{
get { return _name; }
}
public void WorkOnName()
{
TextInfo txtInfo = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo;
_name = txtInfo.ToTitleCase(_name);
}
}
Keduanya menghasilkan hasil yang sama. Apakah ini situasi di mana tidak ada yang benar dan salah, dan itu hanya masalah pilihan?
public string Name { get; protected set; }
melalui warisan.Jawaban:
Ada beberapa alasan untuk menggunakannya
private set
.1) Jika Anda sama sekali tidak menggunakan bidang dukungan dan menginginkan properti otomatis hanya-baca:
2) Jika Anda ingin melakukan pekerjaan tambahan ketika Anda memodifikasi variabel di dalam kelas Anda dan ingin menangkapnya di satu lokasi:
Namun, secara umum, ini masalah preferensi pribadi. Sejauh yang saya tahu, tidak ada alasan kinerja untuk menggunakan salah satunya.
sumber
private set
. :-)public string Name { get; }
. Jika Anda tidak ingin properti yang dapat diubah-ubah, itulah sintaks yang disukai sekarang.private set
adalah bahwa itu tidak kekal seperti yang kita inginkan. Jika Anda ingin menerapkan kelas yang benar-benar tidak dapat diubah, baca saja adalah suatu keharusan.Gunakan set pribadi ketika Anda ingin setter tidak dapat diakses dari luar .
Gunakan hanya baca saat Anda ingin mengatur properti hanya sekali . Dalam konstruktor atau penginisialisasi variabel.
UJI INI:
sumber
readonly
kata kunci C # , adalah untuk diterapkanReadOnly
ke bidang alih-alih ke properti.Bisakah saya menyarankan opsi ketiga?
Ini menjadikan properti Nama hanya Baca secara efektif untuk semua kode luar dan menyediakan metode Tetapkan secara eksplisit. Saya lebih suka Set eksplisit daripada hanya menggunakan set pada properti Name karena Anda mengubah nilai saat mengaturnya. Biasanya jika Anda menetapkan nilai properti, Anda berharap mendapatkan nilai yang sama kembali ketika Anda memanggil get nanti, yang tidak akan terjadi jika Anda melakukan ToTitleCase Anda di set .
Namun, seperti yang Anda katakan, tidak ada jawaban yang benar.
sumber
Mulai dari C # 6.0, properti otomatis hanya pengambil telah ditambahkan ke dalam bahasa. Lihat di sini: https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#getter-only-auto-properties .
Ini sebuah contoh:
sumber
Jangan gunakan contoh kedua. Inti dari menggunakan properti - bahkan jika tidak ada yang terjadi di luar pengambil getter dan pengaturan setter - adalah untuk menyalurkan semua akses melalui pengambil dan penyetel sehingga jika Anda perlu mengubah perilaku di masa depan, semuanya ada di satu tempat.
Contoh kedua Anda mengabaikan hal itu jika mengatur properti. Jika Anda menggunakan pendekatan itu di kelas yang besar, kompleks, dan kemudian perlu mengubah perilaku properti, Anda akan berada di tanah pencarian dan ganti, alih-alih melakukan perubahan di satu tempat - setter pribadi.
sumber
Setiap kali saya perlu mengubah tingkat akses setter, saya biasanya mengubahnya menjadi Terlindungi (hanya kelas ini dan kelas turunan yang dapat mengubah nilai) atau Teman (hanya anggota majelis saya yang dapat mengubah nilai).
Tetapi menggunakan Private sangat masuk akal ketika Anda ingin melakukan tugas lain di setter selain mengubah nilai backing. Seperti yang ditunjukkan sebelumnya, desain yang bagus untuk tidak merujuk nilai dukungan Anda secara langsung tetapi hanya mengaksesnya melalui properti mereka. Itu memastikan bahwa nanti perubahan yang Anda lakukan pada properti diterapkan secara internal maupun eksternal. Dan hampir tidak ada penalti performa untuk mereferensikan properti vs variabel pendukungnya.
sumber
Tapi untuk memperjelas, mengakses properti adalah lebih lambat dari mengakses variabel dukungan nya. Pembuat dan penyetel properti adalah metode yang membutuhkan Panggilan dan Pengembalian, sedangkan variabel dukungan properti diakses secara langsung.
Itu sebabnya, dalam kasus di mana pengambil properti dapat diakses berkali-kali dalam blok kode, nilai properti kadang-kadang di-cache terlebih dahulu (disimpan dalam variabel lokal) dan variabel lokal yang digunakan sebagai gantinya. Tentu saja, itu mengasumsikan properti tidak dapat diubah secara tidak sinkron saat blok mengeksekusi.
sumber