Saya mencoba mendeklarasikan konstanta PI seperti ini:
public static const double PI = Math.PI;
tetapi mengapa saya mendapatkan kesalahan ini?
The constant 'Calendar.NewCalendar.PI' cannot be marked static
Jawaban:
constmenyiratkan static(Anda tidak memerlukan contoh untuk mereferensikan constnilai).
Saya juga ingin menambahkan poin penting ini: Ketika Anda menautkan (referensi) sebuah assembly dengan a public const, nilai itu disalin ke dalam assembly Anda. Jadi jika constnilai dalam rakitan yang direferensikan berubah, rakitan Anda akan tetap memiliki nilai yang dikompilasi semula.
Jika perilaku ini tidak dapat diterima, maka Anda harus mempertimbangkan untuk menjadikan bidang tersebut sebagai public static readonlybidang.
Lib.dll, disediakan sebagai biner:
public class Foo {
public const int HATS = 42;
public static readonly int GLOVES = 33;
}
App.exe, referensi Lib.dll:
Foo.HATS // This will always be 42 even if the value in Lib.dll changes,
// unless App.exe is recompiled.
Foo.GLOVES // This will always be the same as Foo.GLOVES in Lib.dll
Dari MSDN :
Jangan membuat konstanta untuk merepresentasikan informasi yang ingin Anda ubah setiap saat. Misalnya, jangan gunakan bidang konstan untuk menyimpan harga layanan, nomor versi produk, atau nama merek perusahaan. Nilai-nilai ini dapat berubah dari waktu ke waktu, dan karena compiler menyebarkan konstanta , kode lain yang dikompilasi dengan library Anda harus dikompilasi ulang untuk melihat perubahannya.
Dari DotNetPerls :
DLL. Saat Anda menggunakan
constfield atau deklarasi, compiler C # sebenarnya menyematkan nilaiconstvariabel langsung dalam kode IL. Oleh karena itu, pada dasarnya menghapusconstentitas sebagai entitas yang terpisah.Perhatian: Jika program yang bergantung pada a
consttidak dikompilasi ulang setelahconstnilai berubah, mereka dapat rusak [ karena mereka akan terus menggunakan nilai sebelumnya ].
Konstanta adalah statis menurut definisi.
Konstanta tidak dapat diganti dalam kode selama kompilasi, bukan waktu proses, jadi tidak ada persyaratan untuk definisi instance vs statis.
Semua deklarasi konstanta secara implisit statis, dan spesifikasi C # menyatakan bahwa penyertaan (redundan) pengubah statis dilarang. Saya yakin ini untuk menghindari kebingungan yang dapat terjadi jika pembaca melihat dua konstanta, yang satu dinyatakan statis dan yang lainnya tidak - mereka dapat dengan mudah berasumsi bahwa perbedaan spesifikasi menyiratkan perbedaan dalam semantik. Karena itu, tidak ada larangan untuk menentukan pengubah akses secara berlebihan yang juga merupakan pengubah default, di mana ada pilihan. Misalnya, metode (konkret) dapat secara eksplisit ditandai sebagai pribadi meskipun itu menjadi default. Aturannya adalah jika tidak ada pilihan (mis. Deklarasi metode dalam antarmuka) pengubah redundan dilarang. Di mana ada pilihan, itu diperbolehkan.