2009-01-22 6 views
11

मेरे पास एक enum है जिसका उपयोग कई वर्गों द्वारा किया जाता है। इसे लागू करने का सबसे अच्छा तरीका क्या है?सी # एकाधिक कक्षाओं द्वारा उपयोग की जाने वाली enum बनाने का सबसे अच्छा तरीका क्या है?

उत्तर

8
  1. सही अपने नाम स्थान में enums रखो (या उनके लिए एक नया नाम स्थान बनाने) या
  2. उन्हें एक (स्थिर?) कक्षा में रखो कहीं कि अगर अधिक समझ में आता है।

मैं उन्हें आसान पहुंच और अच्छे संगठन के लिए अपनी फ़ाइल में रखूंगा।

मैं आमतौर पर उन्हें कक्षा में नहीं रखूंगा जबतक कि वे किसी भी तरह से "संबंधित" न हों। जैसे कि कार के प्रकार के लिए एक एनम के साथ एक कार श्रेणी है, और एक रोड क्लास और ब्रिज क्लास जो कार के प्रकारों के लिए सीमा निर्धारित कर सकती है। Car.CarType इस के लिए एक तार्किक संगठन प्रतीत होता है ...

+0

मैं अपने नामस्थान में एक enum कैसे डालूं? मैं ऐसी फाइल कैसे बना सकता हूं? – Martijn

+2

के साथ एक नई .cs फ़ाइल बनाएं: नेमस्पेस MyNameSpace {public enum MyEnum {Value1, Value2, Value3}} –

+0

तो क्या मैं बस एक कक्षा बना रहा हूं? – Martijn

8

अपने स्वयं के फ़ाइल में रखो और सिर्फ यह घोषणा:

सार्वजनिक enum फू {एक, ख, ग, घ}

निश्चित रूप से अपने नेमस्पेसिंग पर विचार करें।

12

आमतौर पर मैं उन्हें नामस्थान में फेंक देता हूं। यह क्या Microsoft .NET ढांचे लेखन किया है, तो यह क्या मैं भी करते हैं, स्थिरता के लिए आप समझ :)

+0

अच्छा, मुझे नहीं पता था कि आप ऐसा कर सकते हैं –

3

यहां विभिन्न नामस्थान में दो enums होने का एक उदाहरण है:

using TotallyDifferentNameSpace.Enums; 

namespace EnumEx 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      CarType car = CarType.Audi; 
      PetrolType pType = PetrolType.Diesel; 
     } 
    } 

    public enum CarType 
    { 
     Volkswagen, 
     Audi, 
     Toyota, 
     Ford, 
     Porsche, 
     Lada 
    } 
} 

namespace TotallyDifferentNameSpace.Enums 
{ 
    public enum PetrolType 
    { 
     Gasoline, 
     Diesel 
    } 
} 
-8

मेरी सलाह नहीं करने के लिए है बिल्कुल Enums का उपयोग करें। इसके बजाय सिंगलेट का प्रयोग करें।

public class A : ISomeInterface 
    { 
     public static readonly A Instance = new A(); 
     private A() 
     { 
     } 

    } 

    public class B : ISomeInterface 
    { 
     public static readonly B Instance = new A(); 
     private B() 
     { 
     } 
    } 

ज्यादातर मामलों है कि बेहतर काम करता है और बाद में विस्तार करने के लिए बेहतर है में की तरह।

बेस्ट चाहती

Matze

+0

यह कुछ हद तक सुरक्षित एनम पैटर्न के समान है, लेकिन इसका कोई कारण नहीं है। चुप रहो, अगर इसकी जरूरत पड़ती है तो बाद में अपने enums refactor। – DarkwingDuck

+0

समस्या तब शुरू होती है जब आपको बाद में अपने एम्स का विस्तार करना होगा। ग्राहक ए के लिए एक नया मूल्य, ग्राहक बी के लिए दूसरा। बूम! यूपीएस! दोनों एक ही int में मैप किए गए। बेशक यदि आप 100% सुनिश्चित हैं कि Enum कभी नहीं बदला जाएगा .. – Matze

+0

यदि आपको लगता है कि enums बदल जाएगा, तो आपको गणनाओं का उपयोग नहीं करना चाहिए। इसके बजाए कक्षाओं का प्रयोग करें। –

7

एक्सएमएल टिप्पणियां मदद, खासकर अगर दूसरों (के रूप में FxCop द्वारा निर्देश) का उपयोग यह

/// <summary> 
/// Defines the types of cars we support 
/// </summary> 
public enum CarType 
{ 
    /// <summary> 
    /// VW - the peoples car 
    /// </summary> 
    Volkswagen, 

आपका enum नाम बहुवचन होना चाहिए

public enum CarTypes 

संख्यात्मक मान जोड़ें और bitwise संख्या का उपयोग करें भले ही आप bitw का उपयोग करने की योजना नहीं बनाते आईएसई (बाद में मरम्मत करना दर्द है)।

Volkswagen = 1, 

    /// <summary> 
    /// They own lambo... can't be all that bad 
    /// </summary> 
    Audi = 2, 

    /// <summary> 
    /// Good, cheap, reliable 
    /// </summary> 
    Toyota = 4, 
1

तुम एक enum डाल सकते हैं IntelliSense सुनिश्चित करें कि आपके परियोजना/समाधान के हिस्सा बनाने के काम करने के लिए, .cs एक्सटेंशन वाले नए codefile है और इसलिए है कि आप के लिए एक समाधान गुंजाइश होनी बिल्कुल यह एक सार्वजनिक enum होना चाहिए यह। यदि इंटेलिजेंस एक समस्या है, तो सुनिश्चित करें कि आप एक बार अपना समाधान बनाते हैं, मुझे एक बार यह समस्या थी और बस एक पुनर्निर्माण ने हल किया। नेमस्पेसिंग एक अच्छा विकल्प है यदि आप अपना कोड सही तरीके से व्यवस्थित करना चाहते हैं और आप एक बड़ी परियोजना को कोडिंग कर रहे हैं। .NET ढांचा बड़ा था। इसलिए इसमें बेहतर समझ और कोड संगठन के लिए नामस्थानों के तहत enums है।

0

मुझे पता है कि मेरा सुझाव है।नेट नामकरण सम्मेलन, लेकिन मैं व्यक्तिगत रूप से 'ई' और 'एफ' के साथ enum झंडे के साथ enums prefix (इसी तरह हम कैसे 'मैं' के साथ इंटरफेस prefix)। मैं वास्तव में समझ में नहीं आता कि यह सम्मेलन क्यों नहीं है। एनम्स/फ्लैग एक विशेष मामला है जैसे इंटरफेस जो कभी भी अपना प्रकार नहीं बदलेंगे। न केवल यह स्पष्ट करता है कि यह क्या है, इंटेलिजेंस टाइप करना बहुत आसान है क्योंकि उपसर्ग अधिकांश अन्य प्रकार/चर/आदि फ़िल्टर करेगा, और आपके पास इन नामकरण संघर्ष नहीं होंगे।

और यह एक और समस्या का समाधान भी करेगा जहां डब्ल्यूपीएफ में उदाहरणों के लिए वे स्थिर वर्गों जैसे कि एम्स (उदा। फ़ॉन्टवेइट्स) का उपयोग करते हैं जिनमें पूर्व-परिभाषित उदाहरण हैं लेकिन आप नहीं जानते कि आप इसकी खोज नहीं करते हैं या नहीं। अगर वे सिर्फ 'ई' के साथ उन्हें उपसर्ग करते हैं, तो आपको इन विशेष स्थैतिक वर्गों को खोजने के लिए चरित्र पर टाइप करना होगा।