Pertanyaan Statis hanya baca vs const


Saya sudah membaca tentang const dan static readonly ladang. 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-nilai konstan seperti 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 menggunakannya static readonly bidang, tetapi lebih suka menggunakan properti mungkin?


1201
2018-04-16 11:21


asal


Jawaban:


public static readonly ladang sedikit tidak biasa; public static properti (hanya dengan get) akan lebih umum (mungkin didukung oleh private static readonly bidang).

const nilai-nilai dibakar langsung ke situs-panggilan; ini bermata dua:

  • itu tidak berguna jika nilai diambil saat runtime, mungkin dari konfigurasi
  • jika Anda mengubah nilai const, Anda perlu membangun kembali semua klien
  • tetapi bisa lebih cepat, karena menghindari pemanggilan metode ...
  • ... yang kadang-kadang bisa digarisbawahi oleh JIT

Jika nilainya akan tak pernah berubah, maka const baik-baik saja - Zero dll membuat consts yang wajar; p Selain itu, static sifat lebih umum.


828
2018-04-16 11:24



Saya akan menggunakan static readonly jika Konsumen berada di majelis yang berbeda. Memiliki const dan Konsumen dalam dua majelis yang berbeda adalah cara yang baik untuk Menembak diri sendiri di kaki.


199
2018-04-16 12:57



Beberapa hal lain

const int a 

  • harus diinisialisasi
  • inisialisasi harus pada waktu kompilasi

hanya baca a

  • dapat menggunakan nilai default, tanpa menginisialisasi
  • inisialisasi dapat dilakukan saat dijalankan

173
2018-04-16 11:36



Ini hanya suplemen untuk jawaban yang lain. Saya tidak akan mengulanginya (sekarang empat tahun kemudian).

Ada situasi di mana a const dan non-const memiliki semantik yang berbeda. Sebagai contoh:

const int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

mencetak True, sedangkan:

static readonly int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

menulis False.

Alasannya adalah metode itu x.Equals memiliki dua kelebihan beban, satu yang mengambil dalam short (System.Int16) dan satu yang membutuhkan object (System.Object). Sekarang pertanyaannya adalah apakah satu atau keduanya berlaku dengan saya y argumen.

Kapan y adalah konstanta waktu kompilasi (literal), yang const kasus, menjadi penting bahwa memang ada konversi implisit dari  int  untuk  short asalkan itu int adalah konstanta, dan dengan ketentuan bahwa kompiler C # memverifikasi bahwa nilainya berada dalam kisaran a short (yang 42 aku s). Lihat Konversi ekspresi konstanta implisit dalam Spesifikasi Bahasa C #. Jadi keduanya harus dipertimbangkan. Kelebihan beban Equals(short) lebih disukai (apa saja short adalah object, tapi tidak semua object adalah short). Begitu y dikonversi menjadi short, dan kelebihan itu digunakan. Kemudian Equals membandingkan dua short nilai identik, dan itu memberi true.

Kapan y tidak konstan, tidak implisit konversi dari int untuk short ada. Itu karena secara umum an intmungkin terlalu besar untuk masuk ke dalam short. (Sebuah eksplisit konversi memang ada, tetapi saya tidak mengatakannya Equals((short)y), jadi itu tidak relevan.) Kami melihat bahwa hanya satu kelebihan berlaku, itu Equals(object) satu. Begitu y adalah kotak untuk object. Kemudian Equals akan membandingkan System.Int16 ke a System.Int32, dan karena jenis run-time bahkan tidak setuju, itu akan menghasilkan false.

Kami menyimpulkan bahwa dalam beberapa kasus (jarang), mengubah a const ketik anggota ke a static readonly lapangan (atau cara lain, ketika itu mungkin) dapat mengubah perilaku program.


151
2017-09-11 14:52



Satu hal yang perlu diperhatikan adalah const dibatasi untuk tipe primitif / nilai (pengecualian berupa string)


82
2018-04-16 11:28



Itu readonly kata kunci berbeda dari const kata kunci. SEBUAH const bidang hanya dapat diinisialisasi pada deklarasi lapangan. SEBUAH readonly bidang dapat diinisialisasi baik di deklarasi atau di konstruktor. Karena itu, readonly bidang dapat memiliki nilai yang berbeda tergantung pada konstruktor yang digunakan. Juga, sementara a const bidang adalah konstanta waktu kompilasi, readonly bidang dapat digunakan untuk konstanta waktu proses

Referensi MSDN singkat dan jelas di sini


23
2017-11-14 18:58



Hanya Baca Statis : Nilai dapat diubah melalui static konstruktor saat runtime. Tetapi tidak melalui fungsi anggota.

Konstan : 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 repo saya: C # tipe properti.


16
2018-01-12 17:14