2011-01-03 18 views
17

प्राप्त करने के लिए GetHashCode का उपयोग करते हुए मैं एक enumEnum पूर्णांक मूल्य

public enum INFLOW_SEARCH_ON 
{ 
    ON_ENTITY_HANDLE = 0,   
    ON_LABEL = 1,     
    ON_NODE_HANDLE = 2    
} // enum INFLOW_SEARCH_ON 

है मैं एक ग्रिड कॉलम

में seraching के लिए इस enum उपयोग करने के लिए स्तंभ अनुक्रमणिका मैं

MyEnumVariable.GetHashCode() 
उपयोग कर रहा हूँ प्राप्त करने के लिए है

कौन सा ठीक काम करता है, या मैं

(short)MyEnumVariable 
का उपयोग करना चाहिए

मैं GetHashCode() का उपयोग करने में थोड़ा उलझन में हूं। इसका उपयोग कर कोई समस्या है।

उत्तर

36

का उपयोग GetHashCode() गलत है दूसरा रास्ता बदल सकते हैं। आपको int पर डालना चाहिए। इसका उपयोग करके आप रैप्टर (या रेमंड) के लिए आने और खाने के लिए पूछ रहे हैं।

GetHashCode() enum का पूर्णांक मान वापस करने के लिए होता है एक कार्यान्वयन विवरण है और .NET के भविष्य के संस्करणों में बदल सकता है।

GetHashCode() गारंटी देता है कि यदि दो मान equal हैं तो उनके हैश कोड भी बराबर हैं। दूसरी तरफ दौर की गारंटी नहीं है।

अंगूठे का मेरा नियम है कि अपने कार्यक्रम अभी भी सही ढंग से काम करना चाहिए अगर GetHashCode एक निरंतर मूल्य वापस आना था (परन्तु संभवत: हो ज्यादा धीमी) एक निरंतर GetHashCode के बाद से तुच्छता से अनुबंध को पूरा है, लेकिन बुरा वितरण गुण है।

+0

@Alex मुझे कोई सुराग नहीं है जिसे आप संपादन के साथ कहना चाहते हैं। प्रश्न एनम के संख्यात्मक मूल्य प्राप्त करने के लिए 'गेटहाशकोड' का उपयोग करने के बारे में है। – CodesInChaos

2

आपको (int) MyEnumVariable का उपयोग करना चाहिए। डिफ़ॉल्ट रूप से सभी enums int से विरासत में मिला है।

+0

GetHashCode का प्रयोग करने में कोई भी गंभीर समस्याओं() – Mohit

+2

मुझे लगता है कि इनहेरिट सही शब्द यहाँ नहीं है। – CodesInChaos

+0

@CodeInChaos मेरा मतलब है कि enum MyEnum {} enum के बराबर है MyEnum: int {} –

5

आप शाब्दिक मूल्य प्राप्त करने के लिए (int)MyEnumVariable का उपयोग करना चाहिए ... आप भी तरह (INFLOW_SEARCH_ON)int

1

आपके पास एनम स्थिर वर्ग द्वारा प्रदान किए गए विकल्प विधियां भी हैं। उदाहरण के लिए:

Enum.TryParse<TEnum>(string ValueType, out TEnum Result) 

यदि आप ऐसा करने की कोशिश कर रहे हैं तो Enum का मूल्य प्राप्त करें। आप स्ट्रिंग वैल्यू टाइप प्राप्त कर सकते हैं, उदा। Enum.GetName(...) के साथ "ON_ENTITY_HANDLE"।

अन्यथा, (int) को कास्टिंग निश्चित रूप से GetHashCode() से अधिक पसंद किया जाएगा।

2

जब मैंने प्रोफाइलिंग की, Enum.GetHashCode ने बहुत सारे चक्र उठाए। मैं जहां संभव हो (int) Enum का उपयोग कर इसे सुधारने में सक्षम था।

2

अन्य ने कहा है कि int को कास्टिंग क्यों बेहतर है।

GetHashCode का उपयोग करने का एक अन्य कारण performance. It causes boxing. है मेरे त्वरित परीक्षणों में, GetHashCode लगभग 50 गुना धीमा था (यदि यह मायने रखता है)।

1

मुझे कुछ टिप्पणियां दिखाई देती हैं जो कई कारणों से GetHashCode() का उपयोग करने के नुकसान का वर्णन करती हैं।

कुछ ऐसे मामले हैं जहां (int) INFLOW_SEARCH_ON.ON_LABEL काम नहीं करता है।

Enum से int मान प्राप्त करने का एक अच्छा तरीका GeTTypeCode() विधि का उपयोग कर रहा है। यह विधि अंतर्निहित प्रकार की परवाह किए बिना काम करती है। इस मामले में यह int है।

public enum INFLOW_SEARCH_ON 
{ 
ON_ENTITY_HANDLE = 0,   
ON_LABEL = 1,     
ON_NODE_HANDLE = 2    
} // enum INFLOW_SEARCH_ON 

INFLOW_SEARCH_ON selectedType = INFLOW_SEARCH_ON.ON_LABEL; 

object val = Convert.ChangeType(selectedType, selectedType.GetTypeCode()); 
Console.WriteLine(val); 

इस मामले में आउटपुट '1' है।

संदर्भ: Get int value from enum

+0

इस मामले में enum प्रकार संकलन समय पर जाना जाता है, और आपको समय के साथ बदलने के लिए एक enum के अंतर्निहित प्रकार की उम्मीद नहीं करनी चाहिए; इसलिए आप अंतर्निहित प्रकार के लिए enum को आसानी से डाल सकते हैं, जो इस मामले में 'int' है। यह कहने के लिए, 'लंबा' कहें, तो आप बस उस पर स्थाई रूप से डालना चाहते हैं। – Servy

संबंधित मुद्दे