Satu pertimbangan untuk use case di mana enum default diinginkan adalah untuk menggunakan variabel nullable. Ketika sebuah null diterima, itu dapat diterjemahkan di bagian kode yang benar ke dalam default, dan default ini tidak harus diketahui di sisa kode (yang hanya meneruskan sebuah null).
ErikE
Jawaban:
382
Ini adalah anggota enumerasi yang mewakili nilai 0. Secara khusus, dari dokumentasi :
Nilai default suatu enum Eadalah nilai yang dihasilkan oleh ekspresi (E)0.
Sebagai contoh, ambil enum berikut:
enum E{Foo,Bar,Baz,Quux}
Tanpa mengesampingkan nilai default, pencetakan akan default(E)kembali Fookarena merupakan elemen pertama yang muncul.
Namun, tidak selalu demikian bahwa 0enum diwakili oleh anggota pertama. Misalnya, jika Anda melakukan ini:
enum F{// Give each element a custom valueFoo=1,Bar=2,Baz=3,Quux=0}
Pencetakan default(F)akan memberi Anda Quux, bukan Foo.
Jika tidak ada elemen dalam enum yang Gbersesuaian dengan 0:
enum G{Foo=1,Bar=2,Baz=3,Quux=4}
default(G)mengembalikan secara harfiah 0, meskipun jenisnya tetap seperti G(seperti dikutip oleh dokumen di atas, pemeran untuk jenis enum yang diberikan).
Terima kasih, dan bagaimana dengan enum yang didefinisikan dengan char, bukan int. mis. enum Status {Active = 'A', Inactive = 'I'}
Fernando Torres
3
@Fernando Torres: Masih 0, kecuali salah satu dari nilai enum Anda sesuai dengan '\0'atau default(char), yang sangat tidak mungkin karena default(char)adalah karakter NUL yang sesuai dengan kode char 0.
BoltClock
Saya (salah?) Berasumsi bahwa menggunakan DefaultValueatribut - sesuatu seperti - System.ComponentModel.DefaultValue(MyEnum.Blah)akan mengubah perilaku default(MyEnum)tetapi masih menghasilkan 0. Apakah tidak ada cara untuk membuat abstraksi untuk enumsekitar nilai defaultnya?
Craig Silver
2
@Craig Silver: Atribut DefaultValue berlaku untuk properti - enum adalah tipe dan karenanya, DefaultValue tidak berpengaruh pada tipe enum secara keseluruhan. Saya kira Anda bisa mengatasi ini dengan metode ekstensi macam, tapi Anda lebih baik hanya memeriksa 0.
BoltClock
11
Saya pikir cukup berbahaya untuk mengandalkan urutan nilai-nilai dalam enum dan mengasumsikan bahwa yang pertama selalu default. Ini akan menjadi praktik yang baik jika Anda khawatir tentang melindungi nilai default.
enum E{Foo=0,Bar,Baz,Quux}
Jika tidak, yang diperlukan hanyalah refactor yang ceroboh dari pesanan dan Anda memiliki standar yang sama sekali berbeda.
Maaf kamu salah. Saya berasumsi sama tetapi jika Anda memasukkan Foosetelah Barkeduanya Foodan Barakan memiliki nilai 0 dan E.Foo == E.Barakan kembali true. Ini sangat bodoh dan berlawanan dengan intuisi tapi itu benar :(
Jawaban:
Ini adalah anggota enumerasi yang mewakili nilai
0
. Secara khusus, dari dokumentasi :Sebagai contoh, ambil enum berikut:
Tanpa mengesampingkan nilai default, pencetakan akan
default(E)
kembaliFoo
karena merupakan elemen pertama yang muncul.Namun, tidak selalu demikian bahwa
0
enum diwakili oleh anggota pertama. Misalnya, jika Anda melakukan ini:Pencetakan
default(F)
akan memberi AndaQuux
, bukanFoo
.Jika tidak ada elemen dalam enum yang
G
bersesuaian dengan0
:default(G)
mengembalikan secara harfiah0
, meskipun jenisnya tetap sepertiG
(seperti dikutip oleh dokumen di atas, pemeran untuk jenis enum yang diberikan).sumber
'\0'
ataudefault(char)
, yang sangat tidak mungkin karenadefault(char)
adalah karakter NUL yang sesuai dengan kode char 0.DefaultValue
atribut - sesuatu seperti -System.ComponentModel.DefaultValue(MyEnum.Blah)
akan mengubah perilakudefault(MyEnum)
tetapi masih menghasilkan 0. Apakah tidak ada cara untuk membuat abstraksi untukenum
sekitar nilai defaultnya?Saya pikir cukup berbahaya untuk mengandalkan urutan nilai-nilai dalam enum dan mengasumsikan bahwa yang pertama selalu default. Ini akan menjadi praktik yang baik jika Anda khawatir tentang melindungi nilai default.
Jika tidak, yang diperlukan hanyalah refactor yang ceroboh dari pesanan dan Anda memiliki standar yang sama sekali berbeda.
sumber
Foo
setelahBar
keduanyaFoo
danBar
akan memiliki nilai 0 danE.Foo == E.Bar
akan kembalitrue
. Ini sangat bodoh dan berlawanan dengan intuisi tapi itu benar :(