Saya sudah membaca tentang const
dan static readonly
bidang. Kami memiliki beberapa kelas yang hanya berisi nilai konstan. Digunakan untuk berbagai hal di dalam sistem kami. Jadi saya bertanya-tanya apakah pengamatan saya benar:
Haruskah nilai konstan semacam ini selalu static readonly
untuk semua yang bersifat publik? Dan hanya digunakan const
untuk nilai internal / dilindungi / pribadi?
Apa yang kamu sarankan? Haruskah saya bahkan mungkin tidak menggunakan static readonly
bidang, melainkan menggunakan properti mungkin?
static readonly
: coba gunakan const di dalamIEnumerator
yang akan memicu unrecheableyield
dan Anda akan mendapatkan "kesalahan kompiler internal" yang ditakuti . Saya tidak menguji kode di luar Unity3D, tapi saya percaya ini adalah bug mono atau .NET . Meskipun demikian, ini adalah masalah c # .static readonly
tidak dapat digunakan dalamswitch-case
pernyataan sebagaicase
variabel,const
diperlukan untuk tujuan ini.static readonly
tidak dapat digunakan sebagai parameter atribut jugaJawaban:
public static readonly
ladang sedikit tidak biasa;public static
properti (dengan hanya aget
) akan lebih umum (mungkin didukung olehprivate static readonly
bidang).const
nilai dibakar langsung ke situs panggilan; ini bermata dua:Jika nilainya tidak akan pernah berubah, maka const baik-baik saja -
Zero
dll buat konstanta yang masuk akal; p Selain itu,static
properti lebih umum.sumber
readonly
bidang tidak dapat digunakan dalam pernyataan switch / case, sebagai gantinya Anda membutuhkannyaconst
.Saya akan menggunakan
static readonly
jika Konsumen berada dalam majelis yang berbeda. Memilikiconst
dan Konsumen dalam dua majelis berbeda adalah cara yang bagus untuk menembak diri sendiri .sumber
internal const
ataupublic static readonly
tergantung pada visibilitas yang diinginkan.public const
(misalnya, apa pun bagian dari standar. Setiap kali saya bekerja dengan XML, ada file namespaces dengan sekelompokpublic const string
.) Tetapi secara umum,public const
hanya boleh digunakan setelah mempertimbangkan implikasinya dengan benar.Beberapa hal yang lebih relevan untuk dicatat:
const int a
hanya baca int
sumber
ctor
satu - satunya.Ini hanya pelengkap jawaban lainnya. Saya tidak akan mengulanginya (sekarang empat tahun kemudian).
Ada situasi di mana a
const
dan non-const memiliki semantik yang berbeda. Sebagai contoh:mencetak
True
, sedangkan:menulis
False
.Alasannya adalah bahwa metode ini
x.Equals
memiliki dua kelebihan, satu mengambilshort
(System.Int16
) dan satu mengambilobject
(System.Object
). Sekarang pertanyaannya adalah apakah satu atau keduanya berlaku dengany
argumen saya .Ketika
y
konstanta waktu kompilasi (literal),const
kasus, menjadi penting bahwa memang ada konversi implisit dariint
keshort
asalkanint
konstanta, dan asalkan kompiler C # memverifikasi bahwa nilainya berada dalam kisaran ashort
( yang mana42
). Lihat Konversi ekspresi konstan yang tersirat dalam Spesifikasi Bahasa C #. Jadi kedua kelebihan harus dipertimbangkan. OverloadEquals(short)
lebih disukai (setiapshort
adalahobject
, tetapi tidak semuaobject
adalahshort
). Jadiy
dikonversi keshort
, dan kelebihan itu digunakan. KemudianEquals
membandingkan duashort
nilai identik, dan itu memberitrue
.Bila
y
tidak konstan, tidak ada implisit konversi dariint
keshort
ada. Itu karena secara umumint
mungkin terlalu besar untuk dimasukkan ke dalamshort
. ( Konversi eksplisit memang ada, tetapi saya tidak mengatakannyaEquals((short)y)
, jadi itu tidak relevan.) Kita melihat bahwa hanya satu kelebihan yang berlaku, yangEquals(object)
satu. Jadiy
kotak untukobject
. MakaEquals
akan membandingkan aSystem.Int16
ke aSystem.Int32
, dan karena tipe run-time bahkan tidak setuju, itu akan menghasilkanfalse
.Kami menyimpulkan bahwa dalam beberapa kasus (jarang), mengubah anggota
const
tipe menjadistatic readonly
bidang (atau sebaliknya, jika memungkinkan) dapat mengubah perilaku program.sumber
short x = 42;
sah. Karena di sana Anda memilikiint
, yaitu literal42
, yang secara implisit berubah menjadishort x
. Tapi kemudian, mereka mungkin membatasi ini hanya untuk literal angka; Namun, mereka memilih untuk mengizinkan juga hal-hal seperti dishort x = y;
manay
didefinisikan sebagaiconst int y = 42;
, dan kemudian mereka berakhir dengan ini.Satu hal yang perlu diperhatikan adalah const terbatas pada tipe primitif / nilai (pengecualian adalah string)
sumber
const
dapat digunakan untuk tipe lain juga, kecuali bahwa itu harus diinisialisasi ke nol, yang membuatnya tidak berguna :)System.Exception
? :)const
dapat digunakan, adalahsbyte
,byte
,short
,ushort
,int
,uint
,long
,ulong
,char
,float
,double
,decimal
,bool
, ditambahenum
jenis.const
tidak dapat digunakan untuk tipe nilai lainnya, sepertiDateTime
atauTimeSpan
atauBigInteger
. Itu juga tidak dapat digunakan untukIntPtr
struct (dianggap sebagai tipe "primitif" oleh sebagian orang; istilah tipe primitif membingungkan dalam C #). ↵↵const
Dapat digunakan untuk semua jenis referensi . Jika jenisnyastring
, nilai string apa pun dapat ditentukan. Kalau tidak, nilainya harusnull
.const
menggunakandefault
. Untukstruct
tipe, ini adalah instance dengan semua anggotanya disetel ke nilai default.Hanya Baca Statis : Nilai dapat diubah melalui
static
konstruktor saat runtime. Tetapi tidak melalui Fungsi anggota.Constant : Secara default
static
. Nilai tidak dapat diubah dari mana saja (Ctor, Function, runtime dll no-where)Hanya Baca : Nilai dapat diubah melalui konstruktor saat runtime. Tetapi tidak melalui Fungsi anggota.
Anda dapat melihat pada repo saya: tipe properti C # .
sumber
Kata
readonly
kunci berbeda dariconst
kata kunci. Sebuahconst
lapangan hanya bisa diinisialisasi pada deklarasi lapangan. Sebuahreadonly
lapangan dapat diinisialisasi baik di deklarasi atau dalam konstruktor. Oleh karena itu,readonly
bidang dapat memiliki nilai yang berbeda tergantung pada konstruktor yang digunakan. Juga, sementaraconst
bidang adalah konstanta waktu kompilasi,readonly
bidang tersebut dapat digunakan untuk konstanta runtimeReferensi MSDN singkat dan jelas di sini
sumber
const
danreadonly
serupa, tetapi mereka tidak persis sama.Sebuah
const
lapangan adalah waktu kompilasi konstan, yang berarti bahwa nilai yang dapat dihitung pada saat kompilasi. Sebuahreadonly
lapangan memungkinkan skenario tambahan di mana beberapa kode harus dijalankan selama konstruksi dari jenis. Setelah konstruksi,readonly
bidang tidak dapat diubah.Misalnya,
const
anggota dapat digunakan untuk mendefinisikan anggota seperti:Karena nilai-nilai seperti 3.14 dan 0 adalah konstanta kompilasi-waktu. Namun, pertimbangkan kasus di mana Anda mendefinisikan suatu tipe dan ingin memberikan beberapa contoh pre-fab. Misalnya, Anda mungkin ingin mendefinisikan kelas Warna dan memberikan "konstanta" untuk warna umum seperti Hitam, Putih, dll. Tidak mungkin melakukan ini dengan anggota const, karena sisi kanan bukan konstanta waktu kompilasi. Orang dapat melakukan ini dengan anggota statis biasa:
Tapi kemudian tidak ada yang bisa mencegah klien Color dari mucking dengan itu, mungkin dengan menukar nilai Hitam dan Putih. Tak perlu dikatakan, ini akan menimbulkan kekhawatiran bagi klien lain dari kelas Warna. Fitur "readonly" membahas skenario ini.
Dengan hanya memasukkan
readonly
kata kunci dalam deklarasi, kami menjaga inisialisasi yang fleksibel sambil mencegah kode klien dari mucking sekitar.Sangat menarik untuk dicatat bahwa anggota const selalu statis, sedangkan anggota readonly bisa statis atau tidak, seperti bidang biasa.
Dimungkinkan untuk menggunakan kata kunci tunggal untuk kedua tujuan ini, tetapi ini mengarah ke masalah versi atau masalah kinerja. Asumsikan sejenak bahwa kami menggunakan satu kata kunci untuk ini (const) dan pengembang menulis:
dan pengembang lain menulis kode yang mengandalkan A:
Sekarang, dapatkah kode yang dihasilkan mengandalkan fakta bahwa AC adalah konstanta waktu kompilasi? Yaitu, bisakah penggunaan AC diganti dengan nilai 0? Jika Anda mengatakan "ya" untuk ini, maka itu berarti bahwa pengembang A tidak dapat mengubah cara AC diinisialisasi - ini mengikat tangan pengembang A tanpa izin.
Jika Anda mengatakan "tidak" untuk pertanyaan ini, maka optimasi penting tidak terjawab. Mungkin penulis A yakin bahwa AC akan selalu nol. Penggunaan const dan readonly memungkinkan pengembang A untuk menentukan maksud. Ini membuat perilaku versi yang lebih baik dan juga kinerja yang lebih baik.
sumber
Preferensi saya adalah menggunakan const kapan saja saya bisa, yang seperti yang disebutkan di atas terbatas pada ekspresi literal atau sesuatu yang tidak memerlukan evaluasi.
Jika saya menghadapi batasan itu, maka saya mundur ke statis baca saja , dengan satu peringatan. Saya biasanya akan menggunakan properti statis publik dengan pengambil dan bidang baca statis pribadi pendukung seperti yang disebutkan Marc di sini .
sumber
Referensi: c-sharpcorner
sumber
Bidang baca statis hanya menguntungkan saat mengekspos ke majelis lain nilai yang mungkin berubah di versi yang lebih baru.
Misalnya, anggap majelis
X
memperlihatkan konstanta sebagai berikut:Jika rakitan
Y
referensiX
dan menggunakan konstanta ini, nilai 2.3 akan dimasukkan ke rakitanY
saat dikompilasi. Ini berarti bahwa jikaX
nanti dikompilasi ulang dengan konstanta yang ditetapkan ke 2.4,Y
masih akan menggunakan nilai lama 2.3 hinggaY
dikompilasi ulang. Bidang readonly statis menghindari masalah ini.Cara lain untuk melihat ini adalah bahwa nilai apa pun yang mungkin berubah di masa depan tidak konstan menurut definisi, dan karenanya tidak boleh direpresentasikan sebagai nilai.
sumber
const:
hanya baca:
sumber
Const : nilai-nilai variabel const harus didefinisikan bersama dengan deklarasi dan setelah itu tidak akan berubah. const secara statis bersifat statis sehingga tanpa membuat instance kelas kita dapat mengaksesnya. ini memiliki nilai pada waktu kompilasi
ReadOnly : nilai readonly variabel yang dapat kita definisikan saat mendeklarasikan serta menggunakan konstruktor saat runtime. variabel readonly tidak dapat mengakses tanpa instance kelas.
Static readonly : nilai variabel readonly statis yang dapat kita definisikan saat mendeklarasikan serta hanya melalui konstruktor statis tetapi tidak dengan konstruktor lain. Variabel ini juga dapat kita akses tanpa membuat instance kelas (Sebagai variabel statis).
baca statis akan menjadi pilihan yang lebih baik jika kita harus mengkonsumsi variabel dalam majelis yang berbeda. Silakan periksa detail lengkap di tautan di bawah ini
https://www.stum.de/2009/01/14/const-strings-a-very-convenient-way-to-shoot-yself-in-the-foot/
sumber
Ada perbedaan kecil antara bidang const dan baca statis di C # .Net
const harus diinisialisasi dengan nilai pada waktu kompilasi.
const secara default statis dan perlu diinisialisasi dengan nilai konstan, yang tidak dapat dimodifikasi kemudian. Itu tidak bisa digunakan dengan semua tipe data. Untuk ex-DateTime. Itu tidak bisa digunakan dengan tipe data DateTime.
readonly dapat dinyatakan sebagai statis, tetapi tidak perlu. Tidak perlu diinisialisasi pada saat deklarasi. Nilainya dapat ditetapkan atau diubah menggunakan konstruktor satu kali. Jadi ada kemungkinan untuk mengubah nilai bidang hanya baca sekali (tidak masalah, apakah itu statis atau tidak), yang tidak mungkin dengan const.
sumber
Konstanta seperti namanya, bidang yang tidak berubah dan biasanya didefinisikan secara statis pada waktu kompilasi dalam kode.
Variabel hanya baca adalah bidang yang dapat berubah dalam kondisi tertentu.
Mereka dapat diinisialisasi ketika Anda pertama kali mendeklarasikannya seperti konstanta, tetapi biasanya mereka diinisialisasi selama konstruksi objek di dalam konstruktor.
Mereka tidak dapat diubah setelah inisialisasi terjadi, dalam kondisi yang disebutkan di atas.
Baca-saja statis terdengar seperti pilihan yang buruk bagi saya karena, jika itu statis dan tidak pernah berubah, jadi gunakan saja konstelasi publik, jika itu dapat berubah maka itu tidak konstan dan kemudian, tergantung pada kebutuhan Anda, Anda dapat menggunakan baca -only atau hanya variabel biasa.
Juga, perbedaan penting lainnya adalah konstanta milik kelas, sedangkan variabel read-only milik instance!
sumber
Sebuah konst (ditentukan pada waktu kompilasi) dapat digunakan dalam kasus-kasus di mana statik yang tidak dapat dibaca, seperti dalam pernyataan switch, atau konstruktor atribut. Ini karena bidang hanya baca diselesaikan pada waktu berjalan, dan beberapa konstruksi kode memerlukan jaminan waktu kompilasi. Statis yang dapat dibaca dapat dihitung dalam konstruktor, yang seringkali merupakan hal yang penting dan berguna. Perbedaannya fungsional, sebagaimana seharusnya penggunaannya menurut saya.
Dalam hal alokasi memori, setidaknya dengan string (menjadi tipe referensi), tampaknya tidak ada perbedaan dalam bahwa keduanya diinternir dan akan merujuk pada satu contoh yang diinternir.
Secara pribadi, default saya hanya statis, karena lebih masuk akal semantik dan logis bagi saya, terutama karena sebagian besar nilai tidak diperlukan pada waktu kompilasi. Dan, omong-omong, statika yang bisa dibaca publik bukan tidak biasa atau tidak umum sama sekali seperti yang dinyatakan oleh jawaban: misalnya,
System.String.Empty
adalah satu.sumber
Perbedaan lain antara mendeklarasikan const dan static readonly adalah dalam alokasi memori.
Bidang statis milik jenis objek daripada turunan dari jenis itu. Akibatnya, setelah kelas direferensikan untuk pertama kalinya, bidang statis akan "hidup" di memori untuk sisa waktu, dan contoh yang sama dari bidang statis akan dirujuk oleh semua contoh dari tipe tersebut.
Di sisi lain, bidang const "milik turunan dari tipe.
Jika ingatan akan alokasi lebih penting bagi Anda, lebih baik gunakan const . Jika kecepatan, maka gunakan baca statis saja .
sumber