ค่าเริ่มต้นสำหรับตัวแปร enum คืออะไร


240

ตัวแปร enum ทุกคนรู้ว่ามันเป็นค่าเริ่มต้นองค์ประกอบแรกเสมอ?


1
ข้อควรพิจารณาอย่างหนึ่งสำหรับกรณีการใช้งานที่ต้องการค่าเริ่มต้นของ enum คือใช้ตัวแปรที่ไม่มีค่า เมื่อได้รับค่า null มันสามารถแปลในส่วนที่ถูกต้องของรหัสเป็นค่าเริ่มต้นและไม่จำเป็นต้องรู้ค่าเริ่มต้นในส่วนที่เหลือของรหัส (ที่เพิ่งผ่านไปเป็นโมฆะ)
ErikE

คำตอบ:


381

0มันเป็นสิ่งที่สมาชิกของการแจงนับหมายถึงค่า โดยเฉพาะจากเอกสาร :

ค่าเริ่มต้นของคุ้มค่าที่ผลิตโดยการแสดงออกenum E(E)0

ตัวอย่างเช่นใช้ enum ต่อไปนี้:

enum E
{
    Foo, Bar, Baz, Quux
}

หากไม่มีการแทนที่ค่าเริ่มต้นการพิมพ์default(E)จะส่งคืนFooเนื่องจากเป็นองค์ประกอบแรกที่เกิดขึ้น

อย่างไรก็ตามมันไม่ได้เป็นอย่างนั้นเสมอว่า0สมาชิกคนแรกจะเป็นตัวแทนของ enum ตัวอย่างเช่นถ้าคุณทำสิ่งนี้:

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

การพิมพ์default(F)จะทำให้คุณไม่QuuxFoo

หากไม่มีองค์ประกอบใดใน enum ที่Gตรงกับ0:

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

default(G)ส่งคืนตัวอักษร0ถึงแม้ว่าประเภทของมันจะยังคงเป็นG(ตามที่อ้างโดยเอกสารข้างต้นโยนไปยังประเภท enum ที่กำหนด)


1
ขอบคุณและสิ่งที่เกี่ยวกับ enums ที่กำหนดไว้กับถ่านแทน int เช่น enum สถานะ {Active = 'A', Inactive = 'I'}
Fernando Torres

3
@Fernando Torres: ยังคงเป็น 0 เว้นแต่ว่าค่า enum ของคุณจะตรงกับ'\0'หรือdefault(char)ซึ่งไม่น่าเป็นไปได้สูงเนื่องจากdefault(char)เป็นอักขระ NUL ที่สอดคล้องกับรหัส char 0
BoltClock

ฉัน (ไม่ถูกต้อง?) สันนิษฐานว่าการใช้DefaultValueคุณลักษณะ - อย่างเช่น - จะSystem.ComponentModel.DefaultValue(MyEnum.Blah)ปรับเปลี่ยนพฤติกรรมของdefault(MyEnum)แต่มันก็ยังให้ผลเป็น 0 ไม่มีวิธีใดที่จะสร้างสิ่งที่เป็นนามธรรมสำหรับenumค่าเริ่มต้นของมัน
Craig Silver

2
@Craig Silver: แอ็ตทริบิวต์ DefaultValue นำไปใช้กับคุณสมบัติ - enum เป็นประเภทและเป็นเช่นนี้ DefaultValue จะไม่มีผลกับประเภท enum โดยรวม ฉันคิดว่าคุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยวิธีการขยายที่แปลกใหม่ แต่คุณควรจะตรวจสอบ 0.
BoltClock

11

ฉันคิดว่ามันค่อนข้างอันตรายที่ต้องพึ่งพาลำดับของค่าใน enum และคิดว่าสิ่งแรกคือค่าเริ่มต้นเสมอ นี่จะเป็นการปฏิบัติที่ดีหากคุณกังวลเกี่ยวกับการปกป้องค่าเริ่มต้น

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

ไม่เช่นนั้นสิ่งที่ต้องทำก็คือการสั่งซื้อซ้ำอย่างประมาทและคุณมีค่าเริ่มต้นแตกต่างไปจากเดิมอย่างสิ้นเชิง


3
ขออภัยคุณผิด ผมเคยสันนิษฐานเดียวกัน แต่ถ้าคุณใส่Fooหลังจากที่Barทั้งสองFooและBarจะมีค่าเป็น 0 และจะกลับมาE.Foo == E.Bar trueมันงี่เง่าและตอบโต้ได้ง่าย แต่มันเป็นเรื่องจริง :(
Pawcio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.