Enum dan Konstanta. Yang akan digunakan kapan?

96

Saya sedang membaca beberapa enum dan menemukan mereka sangat mirip dengan mendeklarasikan konstanta. Bagaimana saya tahu kapan harus menggunakan konstanta daripada enum atau sebaliknya. Apa saja keuntungan menggunakan enum?

Draco
sumber
lihat juga stackoverflow.com/questions/11575376/… untuk pertanyaan serupa untuk Java (jawaban sebagian besar juga berlaku untuk C #).
Alexei Levenkov

Jawaban:

96

Gunakan enum ketika Anda ingin menentukan rentang nilai yang bisa dimiliki sesuatu. Warna adalah contoh nyata seperti:

public enum Colour
{
    White,
    Red,
    Blue
}

Atau mungkin serangkaian kemungkinan hal seperti: (Contoh yang saya curi dari sini karena saya malas)

[FlagsAttribute]
enum DistributedChannel
{
  None = 0,
  Transacted = 1,
  Queued = 2,
  Encrypted = 4,
  Persisted = 16,
  FaultTolerant = Transacted | Queued | Persisted
}

Konstanta harus untuk nilai tunggal, seperti PI. Tidak ada rentang nilai PI, yang ada hanya PI.

Hal lain yang perlu dipertimbangkan adalah:

  • a: Konstanta tidak selalu menunjukkan hubungan antara konstanta, sedangkan enumerasi menunjukkan bahwa sesuatu bisa menjadi salah satu himpunan yang ditentukan oleh enum.
  • b: Enumerasi yang ditentukan dapat membantu Anda dengan pemeriksaan tipe saat digunakan sebagai argumen. Konstanta hanyalah nilai, jadi konstanta tidak memberikan informasi semantik tambahan apa pun.
Andrew Barrett
sumber
1
Bagaimana jika Anda akhirnya menggunakan .ToString()banyak enum, nilai apa pun dalam menggunakan kelas dengan string const yang terlihat dan bertindak seperti enum tetapi menghindari panggilan ke ToString()? Contoh
Sinjai
Tunggu, saya pikir saya menjawab pertanyaan saya sendiri. Kode dalam contoh itu tidak akan berfungsi: Anda harus mengambil input sebagai string, yang tidak akan berperilaku seperti enum.
Sinjai
1
Mengapa Anda tidak bisa hanya memiliki warna kelas statis dengan warna konstan daripada enum? Apa bedanya?
WDUK
dalam pernyataan singkatType Safety"
ahmednabil88
31

Apa yang hilang dari jawaban lain adalah bahwa enum memiliki tipe basis integer. Anda dapat mengubah default dari int ke tipe integral lainnya kecuali char seperti:

enum LongEnum : long {
    foo,
    bar,
}

Anda bisa mentransmisikan secara eksplisit dari dan secara implisit ke tipe dasar, yang berguna dalam pernyataan switch. Berhati-hatilah bahwa seseorang dapat mentransmisikan nilai apa pun dari tipe dasar ke enum, meskipun enum tersebut tidak memiliki anggota dengan nilai yang sesuai. Jadi selalu menggunakan bagian default di sakelar adalah ide yang bagus. BTW, .NET sendiri memungkinkan bahkan enum bernilai floating point, tetapi Anda tidak dapat mendefinisikannya di C #, meskipun saya pikir Anda masih dapat menggunakannya (kecuali di switch).

Selain itu, menggunakan enum memberi Anda lebih banyak keamanan tipe. Jika Anda berniat untuk menggunakan misalnya int konstanta sebagai parameter metode, maka saya bisa memanggil metode dengan nilai int apapun. Memang, melalui casting itu bisa terjadi dengan enum juga, tapi itu tidak akan terjadi secara tidak sengaja. Lebih buruk lagi adalah kemungkinan untuk mengacaukan urutan parameter.

void method(int a, int b) {...}

Jika konstanta A hanya dapat berubah menjadi a dan konstanta B hanya dapat berubah menjadi b, maka menggunakan dua jenis enum yang berbeda akan mengungkap penyalahgunaan selama kompilasi.

Johannes
sumber
21

Konstanta adalah fitur bahasa yang mengatakan bahwa variabel tidak akan mengubah nilai (sehingga kompilator dapat melakukan pengoptimalan seputar pengetahuan itu) di mana enum adalah tipe tertentu.

Konstanta bisa berupa tipe data apa pun, tetapi enum adalah enum.

Saya menggunakan enum di mana saja Anda dapat memiliki sejumlah opsi dan ingin meningkatkan keterbacaan kode. yaitu Anda bisa memiliki tingkat jejak sebagai int dengan nilai 0, 1, 2 atau sebagai enum sebagai kesalahan, peringatan dan info.

Enum's juga memiliki kemampuan untuk digunakan sebagai operator bitwise, yaitu FontStyle.Bold | FontStyle.Italic akan memberi Anda font tebal dan miring.

Robert MacLean
sumber
8

Selain jawaban Robert:

  1. Gunakan enum untuk kumpulan nilai bernama yang terbatas. Anda tidak terlalu peduli dengan nilai numerik di balik setiap simbol (tetapi Anda masih memiliki kemampuan untuk memaksakannya, misalnya untuk kompatibilitas dengan sistem lama).

  2. Robert: Ya, Enum dapat digunakan sebagai bidang bit. Gunakan atribut Flags (dan pastikan anggota enum memiliki nilai numerik yang sesuai).

Serge Wautier
sumber
3

Konstanta AC # mirip dengan variabel karena memberikan nama yang ditentukan ke suatu nilai. Namun, konstanta berbeda dari variabel standar karena setelah ditentukan, nilai yang ditetapkan ke konstanta tidak pernah dapat diubah. Manfaat utama konstanta adalah bantuannya dalam membuat kode yang mendokumentasikan sendiri serta memungkinkan deklarasi nilai-nilai kunci di satu tempat, yang memungkinkan perawatan yang mudah jika nilainya perlu diperbarui dan perangkat lunak dikompilasi ulang.

Sedangkan daftar Pencacah berguna untuk menentukan urutan dan status, terutama bila ada perkembangan alami melalui status tersebut. Ini karena setiap konstanta dalam daftar dapat diformat dan dibandingkan menggunakan nama atau nilainya. Enum juga dapat digunakan untuk menentukan kumpulan nilai valid yang terbatas.

cukup keras
sumber
3

Satu hal yang saya anggap berguna saat menggunakan enumalih-alih constadalah Anda dapat mengulang melalui nilai dalam enum, jauh lebih sulit untuk melakukannya dengan constnilai.

David Klempfner
sumber