Apakah ini:
public MyClass
{
public const string SomeString = "SomeValue";
}
lebih buruk dari ini:
public MyClass
{
public static string SomeString { get{ return "SomeValue";}}
}
Keduanya dapat dirujuk dengan cara yang sama:
if (someString == MyClass.SomeString)
...
Namun yang kedua, memiliki perlindungan menjadi properti. Tapi seberapa jauh ini lebih baik daripada const?
Saya telah belajar berulang kali tentang bahaya memiliki bidang publik. Jadi ketika saya melihat beberapa kode menggunakan konstanta ini di bidang publik, saya langsung mengatur tentang refactoring mereka ke properti. Tapi setengah jalan, saya bertanya-tanya apa manfaatnya memiliki sifat statis di atas konstanta.
Ada ide?
Jawaban:
Di C # itu sangat buruk karena tidak ada alasan yang disebutkan di utas ini.
Konstanta publik di C # dimasukkan ke dalam rujukan referensi. Artinya, jika Anda memiliki SomeOtherClass dalam rakitan terpisah yang merujuk SomeString di MyClass, CIL yang dihasilkan untuk SomeOtherClass akan berisi string "SomeValue" yang di-hardcode.
Jika Anda pergi untuk memindahkan kembali dll yang berisi MyClass tetapi tidak SomeOtherClass dan mengubah const, SomeOtherClass tidak akan berisi apa yang Anda pikir akan - itu akan berisi nilai asli.
Jika Anda 100% positif itu adalah konstanta universal seperti Pi, menjadi gila; jika tidak injak dengan hati-hati.
Berikut penjelasan yang lebih baik: https://stackoverflow.com/questions/55984/what-is-the-difference-between-const-and-readonly
sumber
const
dan properti hanya-baca.const
dimasukkan ke dalam majelis panggilan, properti read-only tidak.const
dalam C # bodoh. Kami membutuhkan dukungan yang lebih baik untuk kekal ...Mengubah bidang menjadi properti adalah perubahan besar. Anda kehilangan kompatibilitas biner, sumber, dan refleksi.
Tambahan:
http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx
Semua yang dikatakan, saya tidak melihat bagaimana konstanta benar-benar dipengaruhi oleh ini (terutama jika Anda tidak memerlukan fitur di atas), kecuali API Anda berubah sedemikian rupa sehingga mereka tidak lagi konstanta.
sumber
Bahaya bidang publik adalah kenyataan bahwa mereka bisa berubah dan bahwa implementasi yang mendasari mereka dapat berubah.
Ketika datang ke sebuah
const
ini biasanya bukan masalah (mirip dengan penghitungan publik) - kecuali jika Anda berpikir bahwaconst
akan berakhir sebagai bisa berubah dan bahwa Anda akan memerlukan enkapsulasi di sekitar accessor pada suatu waktu (katakan untuk mencatat berapa kali itu terlihat Facebook), Anda sebaiknya menyimpannya sebagai publikconst
.sumber
Konstanta adalah data. Properti menyiratkan kemungkinan perilaku ketika Anda begitu banyak "melihat" nilai.
Perilaku bundling (atau kemungkinan masa depan daripadanya) dengan data konstan sama sekali salah. Untuk sebagian besar sistem tidak masalah, tetapi itu bisa.
Katakanlah nilainya "PI" dan digunakan secara luas dalam perhitungan sistem. Menempatkannya di belakang properti akan memaksa pemrogram klien untuk memprogram pertahanan. Mereka harus menetapkan nilai ke dalam duplikat konstan. Jika mereka tidak menipu, versi berikutnya perpustakaan bisa memiliki beberapa "perilaku" yang tidak diinginkan diperkenalkan di belakang properti. Perilaku properti (jika di perpustakaan yang dikompilasi) tidak diketahui. Mungkin berkinerja baik dalam pengujian, tetapi mungkin ada kode tersembunyi yang dijalankan jika kondisi khusus terpenuhi. Ini bukan optimasi pra-matang. Terutama untuk sistem waktu nyata kehidupan masyarakat bergantung.
Pemrogram klien bahkan mungkin kehilangan keamanan konstanta karena bahasa tidak memungkinkan mereka menetapkan nilai properti ke dalam duplikat konstan mereka.
Juga, ketika programmer dipaksa untuk menetapkan nilai properti Anda ke dalam konstanta mereka sendiri, mereka secara efektif membatalkan perilaku apa pun yang ingin Anda capai dengan properti Anda.
Data konstan sejati tidak memerlukan atau menginginkan enkapsulasi.
sumber