Enum değişkeni için varsayılan değer nedir?


241

Bir enum değişkeni, herkes her zaman ilk öğeye varsayılan olup olmadığını biliyor mu?


1
Varsayılan numaralandırmanın istendiği kullanım durumu için göz önünde bulundurulması gereken bir nokta, boş değerli bir değişken kullanmaktır. Bir null alındığında, kodun doğru bölümünde varsayılan değere çevrilebilir ve bu varsayılan kodun geri kalanında bilinmek zorunda değildir (sadece bir null boyunca geçer).
ErikE

Yanıtlar:


382

Sayımın üyesi ne olursa olsun değeri temsil eder 0. Özellikle, belgelerden :

A'nın varsayılan değeri enum E, ifade tarafından üretilen değerdir (E)0.

Örnek olarak, aşağıdaki numaralandırmayı alın:

enum E
{
    Foo, Bar, Baz, Quux
}

Varsayılan değerleri geçersiz kılmadan, yazdırma ilk oluşan öğe olduğundan default(E)geri döner Foo.

Ancak, öyle her zaman değil bu durumda 0bir enum ilk üyesi ile temsil edilir. Örneğin, bunu yaparsanız:

enum F
{
    // Give each element a custom value
    Foo = 1, Bar = 2, Baz = 3, Quux = 0
}

Baskı default(F)vermek Quuxdeğil Foo.

Bir numaradaki öğelerin hiçbiri aşağıdakilere Gkarşılık gelmiyorsa 0:

enum G
{
    Foo = 1, Bar = 2, Baz = 3, Quux = 4
}

default(G)0türü olarak kalmasına rağmen G(yukarıdaki dokümanlar tarafından belirtildiği gibi, belirli numaralandırma türüne bir döküm) döner .


1
Teşekkürler ve int yerine char ile tanımlanan numaralandırmalar hakkında ne. örn. enum Durum {Aktif = 'A', Aktif Değil = 'I'}
Fernando Torres

3
@Fernando Torres: Enum değerlerinizden birine karşılık gelmediği '\0'ya da 0 koduna karşılık gelen NUL karakteri default(char)olmadığı için pek olası olmadığı sürece hala 0default(char)
BoltClock

Ben (yanlış?) DefaultValueÖzniteliği kullanarak - gibi bir şey - System.ComponentModel.DefaultValue(MyEnum.Blah)davranışını değiştirmek gerekir default(MyEnum)ama yine de 0 verir enum. Varsayılır Varsayılan değeri etrafında bir soyutlama oluşturmak için bir yolu var mı ?
Craig Silver

2
@Craig Silver: DefaultValue özniteliği özellikler için geçerlidir - bir enum bir türdür ve bu nedenle DefaultValue'nun bir bütün olarak enum türü üzerinde hiçbir etkisi yoktur. Sanırım bu tür bir uzatma yöntemi ile çalışabilir, ama sadece 0 kontrol daha iyi
BoltClock

11

Bir enumdaki değerlerin sırasına güvenmek ve ilkinin her zaman varsayılan olduğunu varsaymak oldukça tehlikeli olduğunu düşünüyorum. Varsayılan değeri korumakla ilgileniyorsanız, bu iyi bir uygulamadır.

enum E
{
    Foo = 0, Bar, Baz, Quux
}

Aksi takdirde, gereken tek şey siparişin dikkatsizce yeniden düzenlenmesi ve tamamen farklı bir temerrütünüz olması.


3
Üzgünüm yanılıyorsunuz. Ben aynı kabul ettik ama ikisinden Foosonra koymak ve 0 değerine sahip olacak ve dönecektir . Çok aptalca ve mantıksız ama bu doğru :(BarFooBarE.Foo == E.Bartrue
Pawcio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.