ควร enums ใน C # มีไฟล์ของตัวเอง? [ปิด]


178

ฉันมีคลาสที่ใช้การแจงนับ enum อยู่ในแฟ้มของตัวเองซึ่งดูเหมือนจะสิ้นเปลือง

อะไรคือความคิดเห็นทั่วไปเกี่ยวกับ enums ที่ถูกวางไว้ในเนมสเปซของไฟล์ที่พวกมันถูกใช้ไป หรือ enum ควรอยู่ในไฟล์ cs ของตัวเองหรือไม่

แก้ไข

ฉันควรพูดถึงว่าในขณะที่ชั้นเรียนที่เป็นปัญหาใช้การแจกแจงเหล่านี้ดังนั้นผู้เรียกภายนอก กล่าวอีกนัยหนึ่งคลาสอื่นสามารถตั้งค่าแจงนับเหล่านี้ ดังนั้นพวกเขาจึงไม่ได้ใช้ภายในห้องเรียนมิฉะนั้นคำถามนี้จะเป็นเกมง่ายๆ


86
หากคุณใช้หมายเลขเวทย์มนตร์คุณจะไม่มีปัญหานี้เลย
MusiGenesis

7
นี่ควรเป็นวิกิชุมชนหรือไม่ ไม่มีคำตอบที่ถูกต้องและไม่มีข้อควรพิจารณาทางเทคนิคที่แท้จริงนอกเหนือจากความสามารถของ IDE
Jeff Sternal

1
พวกเขายังสามารถอยู่ในเนมสเปซเดียวกันแม้ว่าจะอยู่ในไฟล์ที่แตกต่างกัน หากคุณกำลังถามคำถามรองว่าจะสร้าง. namesnews และไฟล์ใหม่หรือไม่ฉันจะบอกว่าปกติแล้วไม่ใช่ แต่อย่างอื่นคุณอาจมีความเข้าใจในเนมสเปซผิดและควรอ่านเกี่ยวกับพวกเขา - (ไม่มากสำหรับพวกเขาแค่กลไกองค์กร)
Jason Kleban

1
ประกาศ enum ในไฟล์ของตัวเองอนุญาตให้โปรแกรมเมอร์ค้นหา enum ได้อย่างง่ายดายโดยใช้หน้าต่างคำสั่ง (> ของ [ชื่อ enum])
Riju

คำตอบ:


103

ฉันจะไม่พูดว่า "สิ้นเปลือง" (เสียค่าใช้จ่ายเพิ่มเติมเท่าไร?) แต่บ่อยครั้งที่มันไม่สะดวก โดยปกติแล้วจะมีคลาสหนึ่งที่ใกล้เคียงกับ enum มากที่สุดและฉันใส่ไว้ในไฟล์เดียวกัน


7
มันเพิ่มเสียงรบกวนไปยังไดเรกทอรีเมื่อเรียกดูว่าเป็นสิ่งที่ฉันหมายถึงสิ้นเปลือง
Finglas

117
@ Finglas - เสียงของคนคนหนึ่งเป็นสัญญาณของคนอื่น!
Jeff Sternal เมื่อ

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

2
ถ้า enum นั้นถูกใช้ร่วมกันในคลาสที่ต่างกันก็ควรใส่ไว้ในไฟล์แยกต่างหาก
Konrad

76

นี่เป็นเพียงเรื่องของการตั้งค่า

ฉันชอบที่จะใส่การแจงนับแต่ละไฟล์ไว้ในไฟล์ของมันเอง (เช่นเดียวกันสำหรับแต่ละอินเตอร์เฟสคลาสและโครงสร้าง มันทำให้พวกเขาพบได้ง่ายขึ้นเมื่อฉันมาจากโซลูชันอื่นมิฉะนั้นแล้วยังไม่มีการอ้างอิงถึงประเภทที่เป็นปัญหา

การใส่ประเภทเดียวในแต่ละไฟล์ยังทำให้ง่ายต่อการระบุการเปลี่ยนแปลงในระบบควบคุมแหล่งที่มาโดยไม่แตกต่างกัน


10
"การใส่ชนิดเดียวในแต่ละไฟล์ยังทำให้ง่ายต่อการระบุการเปลี่ยนแปลงในระบบควบคุมแหล่งที่มาโดยไม่แตกต่างกัน" ความกลัวที่จะแตกต่างไม่ควรสร้างรากฐานของการตัดสินใจออกแบบของคุณ ฉันยังยืนยันว่าทุกคนที่ไม่ทราบวิธีการกระจายไฟล์ในการควบคุมแหล่งที่มาอย่างถูกต้องไม่ได้ใช้การควบคุมแหล่งที่มาเลย
Dan Bechard

59

นี่เป็นเรื่องของสไตล์ทั้งหมด สิ่งที่ฉันมักจะทำคือมีไฟล์ที่เรียกว่าEnums.csในโซลูชันที่รวบรวมการประกาศ enum

แต่โดยทั่วไปมักพบผ่านF12กุญแจอยู่แล้ว


4
ผมคิดว่านี่น่าจะเป็นตัวเลือกที่ดีที่สุดในขณะที่มัน: 1) เป็นเพียงหนึ่งไฟล์แทนจำนวนมากซึ่งอาจจะถือเป็นเกะกะไดเรกทอรี 2) มีความชัดเจนสิ่งที่มีอยู่ในไฟล์ 3) หมายความว่าคุณรู้จักที่จะหาenumแทน มันอยู่ในไฟล์ที่มีคลาสที่เกี่ยวข้อง แต่ไม่จำเป็นต้องใช้คลาสเท่านั้น
dav_i

6
ฉันไม่ชอบอย่างนี้ ดังที่กล่าวไว้ในคำตอบของ James Curran, enums มีความสัมพันธ์กับชั้นเรียนเป็นส่วนใหญ่ เมื่อวางทั้งหมดไว้ในไฟล์โกลบอลไฟล์เดียวพวกเขาไม่ได้อยู่ในไดเรกทอรี (สำหรับ sub-namespace) อีกต่อไปที่พวกมันสามารถเป็นของหัวเรื่องได้
เรย์

3
ใช่ @DebugErr ฉันเห็นด้วยกับคุณ เนื่องจากคำตอบนี้ถูกโพสต์ย้อนกลับไปในปี 2010 ฉันได้เปลี่ยนวิธีการต่าง ๆ และมักจะไปกับหนึ่งไฟล์ต่อหนึ่งประเภทหรือประกาศ enums ในไฟล์เดียวกับคลาสที่เกี่ยวข้อง
Fredrik Mörk

@ เร...enums have a relation to classes mostly.ย์ นี่คือที่ที่คุณสูญเสียฉัน โปรดยกตัวอย่างว่าคุณจะจัดการกับ enums ที่มีความสัมพันธ์กับหลายคลาสได้อย่างไร
K - ความเป็นพิษใน SO กำลังเพิ่มขึ้น

@KarlMorrison กรุณาความคิดเห็นนั้นอายุ 5 ปี อย่างไรก็ตามฉันเพิ่มคำว่า "ส่วนใหญ่" ด้วยเหตุผล Enums มีความสัมพันธ์กับคลาสมากกว่าแค่เช่นเนมสเปซด้วย ถ้าฉันมีAnchorStyleenum ใช้ทั่วทั้งไลบรารี UI ฉันมักจะมี namespace ย่อยของ UI และโฟลเดอร์ที่เกี่ยวข้อง ฉันจะวางไว้ในAnchorStyle.csไฟล์ในโฟลเดอร์ UI ที่ฉันสามารถหาได้ง่ายไม่ใช่ไฟล์ "Enums.cs"
เรย์

47

คำถามที่ถามตัวเองว่าจะเป็น: มีอะไรเกี่ยวกับประเภทการแจงนับใน C # ที่ระบุว่าฉันควรปฏิบัติต่อมันแตกต่างจากประเภทอื่น ๆ ทั้งหมดที่ฉันสร้าง?

หากการแจงนับเป็นสาธารณะควรได้รับการปฏิบัติเช่นเดียวกับสาธารณะอื่น ๆ ถ้าเป็นแบบส่วนตัวให้ประกาศว่าเป็นสมาชิกแบบซ้อนของคลาสที่ใช้มัน ไม่มีเหตุผลที่น่าสนใจที่จะนำสองประเภทสาธารณะในไฟล์เดียวกันเพียงเพราะประเภทคือการแจงนับ ความจริงที่ว่ามันเป็นสาธารณะประเภทคือสิ่งที่สำคัญ; รสชาติของประเภทไม่ได้


ถ้าคุณต้องการนำ enums มาใช้ในโซลูชันที่แตกต่างกันของโครงการองค์กรเดียวกัน การผูก enums กับคลาสโดยใช้มันจะยากมากที่จะใช้ซ้ำ
MKO

@mko: การอ้างอิงโครงการแล้วหมายความว่าทั้งคลาสและ enum จะพร้อมใช้งานสำหรับโซลูชันที่แตกต่างกัน อะไรจะทำให้ยาก
Bryan Watts

แน่นอน แต่คุณต้องการแชร์ทั้งคลาสกับตรรกะของคลาสนั้นหรือไม่ถ้าคุณต้องการใช้ enums เท่านั้น ยิ่งไปกว่านั้นถ้าคลาสอื่นมีการแจกแจงแบบเดียวกัน คุณจะวางไว้ที่ไหน
MKO

@mko: ด้วยการอ้างอิงโครงการคุณจะได้รับทั้งสองประเภทไม่ว่าจะเป็นไฟล์ต่าง ๆ หรือไม่ก็ตาม ฉันมีปัญหาในการหาสิ่งที่คุณถาม
ไบรอัน Watts

ฉันไม่ได้พูดถึงการอ้างอิงโครงการคุณคือ ฉันกำลังพูดถึงการย้าย enums ไปยังไฟล์โครงการที่ใช้ร่วมกันและสามารถนำมาใช้ใหม่ในหลายโครงการโดยไม่ต้องเปิดเผยคลาสทั้งหมด คุณพูดว่า "ไม่มีเหตุผลที่น่าสนใจในการใส่สองประเภทสาธารณะในไฟล์เดียวกันเพียงเพราะประเภทหนึ่งคือการแจงนับ" อาจมีเหตุผลที่จะใส่ enums ทั้งหมดในไฟล์เดียวกันหากคุณทำตามคำอธิบายของฉัน
MKO

24

ข้อดีอีกอย่างของการใส่แต่ละประเภท (คลาส, โครงสร้าง, enum) ในไฟล์ของตัวเองคือการควบคุมแหล่งที่มา คุณสามารถรับประวัติทั้งหมดของประเภทได้อย่างง่ายดาย


18

ฉันวางส่วนใหญ่ในเนมสเปซและนอกชั้นเรียนเพื่อให้สามารถเข้าถึงคลาสอื่นในเนมสเปซนั้นได้อย่างง่ายดาย

namespace UserManagement
{
    public enum UserStatus { Active, InActive }
    class User
    {
        ...
    }
}

ว้าว. ฉันไม่รู้จัก enums สามารถวางในเนมสเปซได้โดยตรง ฉันจะไปกับคำตอบนี้ ภายในโครงสร้าง MVC ของฉันพวกเขาจะถูกวางไว้ภายในคอนโทรลเลอร์สิ่งที่ทำให้ฉันมีเหตุผล ขอบคุณสำหรับสิ่งนี้. upvoted
C4d

11

โดยทั่วไปฉันต้องการให้ enums ของฉันอยู่ในไฟล์เดียวกับ Class ที่ส่วนใหญ่น่าจะเป็นคุณลักษณะของ ถ้าเช่นฉันมีคลาสTaskแล้ว enum TaskStatusจะอยู่ในไฟล์เดียวกัน

อย่างไรก็ตามถ้าฉันมีจำนวนทั่วไปมากขึ้นแล้วฉันจะให้พวกเขาตามบริบทในไฟล์ต่างๆ


เกิดอะไรขึ้นถ้าชั้นเรียนที่แตกต่างกันยังใช้ Enum เดียวกัน
MKO

2
@mko - นั่นเป็นเหตุผลที่ฉันพูด (ย้อนกลับไปในปี 2010 เมื่อฉันตอบคำถามนี้) ว่าหาก enums มีลักษณะทั่วไปมากกว่าฉันจะเก็บไว้ในไฟล์แยกต่างหาก ตามบริบทฉันหมายถึงว่าในบางกรณี enums บางอย่างอาจอยู่ในไฟล์แยกกันและในกรณีอื่น ๆ ฉันอาจจัดกลุ่มชุดประกาศ enum ในไฟล์เดียว
Nikos Steiakakis

10

ขึ้นอยู่กับการเข้าถึงที่จำเป็น

ถ้า enum ถูกใช้โดยคลาสเดียวเท่านั้นก็โอเคที่จะประกาศภายในคลาสนั้นเพราะคุณไม่จำเป็นต้องใช้มันในที่อื่น

สำหรับ enums ที่ใช้โดยหลายคลาสหรือใน public API ดังนั้นฉันจะเก็บข้อกำหนดไว้ในไฟล์ของตัวเองในเนมสเปซที่เหมาะสม มันง่ายกว่าที่จะหาด้วยวิธีนี้และกลยุทธ์ตามรูปแบบของไฟล์เดียวต่อไฟล์ซึ่งเหมาะสำหรับใช้กับคลาสและอินเทอร์เฟซเช่นกัน


8

ฉันคิดว่าขึ้นอยู่กับขอบเขตของ enum ตัวอย่างเช่นหาก enum เฉพาะเจาะจงกับหนึ่งคลาสตัวอย่างเช่นใช้เพื่อหลีกเลี่ยงสถานการณ์ค่าคงที่เวทย์มนตร์ฉันจะบอกว่าวางไว้ในไฟล์เดียวกับคลาส:

enum SearchType { Forward, Reverse }

หาก enum เป็นเรื่องทั่วไปและสามารถใช้งานได้หลายคลาสสำหรับสถานการณ์ที่แตกต่างกันฉันจะโน้มน้าวให้ใช้มันในไฟล์ของตัวเอง ตัวอย่างด้านล่างนี้สามารถใช้เพื่อวัตถุประสงค์หลายประการ:

enum Result { Success, Error }

6

ฉันมักจะใส่ enums ไว้ในแฟ้มของตนเองด้วยเหตุผลง่าย ๆ เช่นเดียวกับคลาสและ structs มันเป็นเรื่องดีที่รู้ ว่าต้องดูว่าคุณต้องการค้นหาคำจำกัดความของประเภทใด: ในไฟล์ที่มีชื่อเดียวกัน (เพื่อความเป็นธรรมใน VS คุณสามารถใช้ "ไปที่คำจำกัดความ" ได้เช่นกัน)

เห็นได้ชัดว่ามันสามารถออกไปจากมือ เพื่อนร่วมงานที่ฉันทำงานยังสร้างไฟล์แยกต่างหากสำหรับผู้ได้รับมอบหมาย


6

ข้อดีอย่างหนึ่งของการใช้ไฟล์แยกต่างหากสำหรับ enums คือคุณสามารถลบคลาสเดิมที่ใช้ enum และเขียนคลาสใหม่โดยใช้ enum

ถ้า enum ไม่ขึ้นกับคลาสต้นฉบับให้วางไว้ในไฟล์แยกกันทำให้การเปลี่ยนแปลงในอนาคตง่ายขึ้น


6

หากคุณใช้ Add-in ของ USysWare File Browser สำหรับ Visual Studio คุณสามารถค้นหาไฟล์ที่มีชื่อเฉพาะในโซลูชันของคุณได้อย่างรวดเร็ว ลองนึกภาพว่ากำลังมองหา enum ที่ไม่ได้อยู่ในไฟล์ของมันเอง แต่แทนที่จะฝังไว้ในไฟล์บางไฟล์ในโซลูชันขนาดมหึมา

สำหรับโซลูชันขนาดเล็กมันไม่สำคัญ แต่สำหรับโซลูชันที่มีขนาดใหญ่มันจะกลายเป็นสิ่งที่สำคัญยิ่งกว่าในการรักษาคลาสและ enums ไว้ในไฟล์ของตัวเอง คุณสามารถค้นหาแก้ไขและอีกมากมายได้อย่างรวดเร็ว ฉันขอแนะนำให้ใส่ enum ของคุณลงในไฟล์ของตัวเอง

และตามที่ระบุไว้ ... ไฟล์สิ้นเปลืองแค่ไหนที่กลายเป็นแค่คู่ของ kb ต่อไป?


ฉันใช้ Add-in นั้นด้วยมันค่อนข้างมีประโยชน์ ฉันจะใส่ enums ในไฟล์ของตัวเองไม่ว่าโซลูชันจะเล็กหรือใหญ่
Rui Jarimba

5

ข้อได้เปรียบอย่างมากที่ง่ายมากในการแยกไฟล์ เมื่อวัตถุใด ๆ อยู่ในไฟล์ MyObjectName.cs ของตัวเอง ... คุณสามารถไปที่โซลูชัน explorer และพิมพ์ MyObjectName.cs และแสดงไฟล์ 1 ไฟล์ สิ่งที่ทำให้การดีบั๊กดีขึ้น

ข้อดีอีกประการของบันทึกย่อที่คล้ายกันหากคุณค้นหาไฟล์ทั้งหมด ( ctrl+ shft+ F) สำหรับชื่อคุณอาจพบการอ้างอิง 20 ชื่อในไฟล์เดียวกัน ... และชื่อที่พบนั้นจะเป็นส่วนหนึ่งของวัตถุที่แตกต่างกัน ในหน้าต่างค้นหาผลลัพธ์ทั้งหมดที่คุณเห็นคือหมายเลขบรรทัดและชื่อไฟล์ คุณจะต้องเปิดไฟล์และเลื่อนเพื่อหาวัตถุที่การอ้างอิงที่พบอยู่

สิ่งที่ทำให้การดีบักง่ายขึ้นฉันชอบ


3

หากคุณมีหลายโครงการในโซลูชันเดียว Utilitiesจากนั้นดีกว่าสร้างโครงการอื่น แล้วสร้างโฟลเดอร์และสร้างซ้อนกัน\Enumerations static classจากนั้นกำหนดแต่ละคลาสแบบสแตติกที่คุณจะสร้าง enum ที่สอดคล้องกับชื่อโครงการของคุณ ตัวอย่างเช่นคุณมีโครงการชื่อ DatabaseReader และ DatabaseUsers จากนั้นคุณอาจตั้งชื่อคลาสแบบคงที่เช่น

public static class EnumUtility {
    #region --Database Readers Enum
    public static class EnumDBReader {
         public enum Actions { Create, Retrieve, Update, Delete}; 
    }
    #endregion

    #region --Database Users Enum
    public static class EnumDBUsers {
         public enum UserIdentity { user, admin }; 
    }
    #endregion

}

จากนั้น enum ทั้งหมดที่สามารถใช้ในการแก้ปัญหาทั้งหมดต่อโครงการจะถูกประกาศให้ทราบ ใช้ # regionเพื่อแยกข้อกังวลแต่ละข้อ จากนี้มันง่ายกว่าที่จะมองหา enums ใด ๆ


1

ฉันต้องการมีไฟล์ enums สาธารณะหนึ่งไฟล์ชื่อ E ที่มีแต่ละ enum แยกจากนั้น Enum ใด ๆ สามารถเข้าถึงได้ด้วย E ... และพวกเขาอยู่ในที่เดียวในการจัดการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.