Apakah memiliki konstanta publik “buruk”?


39

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?


1
Konstanta publik yang digunakan dengan cara ini baik-baik saja. Menggunakan properti dengan cara ini berlebihan.
Bernard

2
Sudahkah Anda mempertimbangkan untuk menggunakan kata kunci yang hanya dibaca ? ReadOnly memberi Anda syntanx cleaner dari const tanpa masalah yang disebutkan dalam banyak posting.
Matt Raffel

Bisa juga melakukan ... public static readonly type constantName = 0;
Mengintai

Jawaban:


57

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


3
@Oded, tetapi perbedaan yang sama adalah antara constdan properti hanya-baca. constdimasukkan ke dalam majelis panggilan, properti read-only tidak.
svick

1
Ini adalah sesuatu yang saya tidak tahu. Ini bukti lebih lanjut bahwa bidang publik buruk. Saya pikir bahkan contoh "aman" dari Pi adalah ide yang buruk (Bagaimana jika pengembang menginginkan angka presisi lebih banyak pada Pi? Dan membuat perubahan ke perakitan tanpa mengetahui masalah ini.) Saya memiliki lebih dari 40 majelis di komputer saya. solusi dan saya bisa melihat ini benar-benar menggigit kita jika kita tidak hati-hati.
Vaccano

2
Apakah "Salin" ini terjadi di bagian C # yang lain? (mis. enums)
Vaccano

2
Ya, salinannya memang terjadi. Ini biasanya bukan masalah, tetapi jika kode Anda menggunakan nilai numerik dari Enum dan itu diubah dengan cara yang diuraikan dalam pertanyaan ini, maka itu dapat menyebabkan masalah.
Vaccano

1
Ini adalah salah satu alasan utama mengapa constdalam C # bodoh. Kami membutuhkan dukungan yang lebih baik untuk kekal ...
KChaloux

22

Mengubah bidang menjadi properti adalah perubahan besar. Anda kehilangan kompatibilitas biner, sumber, dan refleksi.

Tambahan:

  • Ada lebih banyak kontrol akses berbutir halus dengan properti. Perlu untuk dapat diakses publik tetapi benar-benar hanya ingin itu diatur dengan akses yang dilindungi? Tidak ada masalah (dari C # 2 dan seterusnya, setidaknya).
  • Ingin masuk ke debugger setiap kali nilainya berubah? Cukup tambahkan breakpoint di setter.
  • Ingin mencatat semua akses? Cukup tambahkan logging ke pengambil.
  • Properti digunakan untuk pengikatan data; bidang tidak.

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.


11

Bahaya bidang publik adalah kenyataan bahwa mereka bisa berubah dan bahwa implementasi yang mendasari mereka dapat berubah.

Ketika datang ke sebuah constini biasanya bukan masalah (mirip dengan penghitungan publik) - kecuali jika Anda berpikir bahwa constakan 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 publik const.


1

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.