नेट में हैश कोड शून्य होना चाहिए


87

यह देखते हुए कि संग्रह एक सेट सदस्य के रूप में System.Collections.Generic.HashSet<>स्वीकार nullकरता है, कोई भी पूछ सकता है कि हैश कोड क्या nullहोना चाहिए। ऐसा लगता है कि ढांचा उपयोग करता है 0:

// nullable struct type
int? i = null;
i.GetHashCode();  // gives 0
EqualityComparer<int?>.Default.GetHashCode(i);  // gives 0

// class type
CultureInfo c = null;
EqualityComparer<CultureInfo>.Default.GetHashCode(c);  // gives 0

यह अशक्त Enums के साथ (थोड़ा) समस्याग्रस्त हो सकता है। अगर हम परिभाषित करते हैं

enum Season
{
  Spring,
  Summer,
  Autumn,
  Winter,
}

तब Nullable<Season>(इसे भी कहा जाता है Season?) केवल पांच मान ले सकते हैं, लेकिन उनमें से दो, अर्थात् nullऔर Season.Spring, एक ही हैश कोड है।

यह इस तरह एक "बेहतर" समानता तुलना लिखने के लिए आकर्षक है:

class NewNullEnumEqComp<T> : EqualityComparer<T?> where T : struct
{
  public override bool Equals(T? x, T? y)
  {
    return Default.Equals(x, y);
  }
  public override int GetHashCode(T? x)
  {
    return x.HasValue ? Default.GetHashCode(x) : -1;
  }
}

लेकिन क्या कोई कारण है कि हैश कोड क्यों nullहोना चाहिए 0?

संपादित करें / अलावा:

कुछ लोगों को लगता है कि यह ओवरराइडिंग के बारे में है Object.GetHashCode()। यह वास्तव में, वास्तव में नहीं है। (.NET के लेखकों के एक ओवरराइड बनाने के लिए किया था GetHashCode()में Nullable<>struct जो है , हालांकि प्रासंगिक,।) Parameterless का एक उपयोगकर्ता के प्रश्न के लिखित कार्यान्वयन GetHashCode()स्थिति कभी नहीं संभाल कर सकते हैं जहां किसी चीज़ जिसका हैश कोड हम तलाश है null

यह अमूर्त विधि को EqualityComparer<T>.GetHashCode(T)लागू करने या अन्यथा इंटरफ़ेस विधि को लागू करने के बारे में है IEqualityComparer<T>.GetHashCode(T)। अब, MSDN के इन लिंक को बनाते समय, मैं देख रहा हूँ कि यह वहाँ कहता है कि ये विधियाँ फेंकती हैं ArgumentNullExceptionयदि उनका एकमात्र तर्क है null। यह निश्चित रूप से MSDN पर एक गलती होनी चाहिए? .NET का कोई भी कार्यान्वयन अपवाद नहीं है। उस मामले में फेंकने से प्रभावी रूप से किसी को जोड़ने nullका प्रयास टूट जाएगा HashSet<>। जब तक HashSet<>एक nullवस्तु के साथ काम करते समय कुछ असाधारण नहीं होता है (मुझे यह परीक्षण करना होगा)।

नई संस्करण / प्रशंसा:

अब मैंने डिबगिंग की कोशिश की। इसके साथ HashSet<>, मैं पुष्टि कर सकता हूं कि डिफ़ॉल्ट समानता तुलना के साथ, मान Season.Springऔर एक ही बाल्टी में समाप्त null हो जाएंगे । यह बहुत ही सावधानी से निजी सरणी सदस्यों m_bucketsऔर निरीक्षण द्वारा निर्धारित किया जा सकता है m_slots। ध्यान दें कि सूचकांक हमेशा डिजाइन द्वारा, एक से ऑफसेट होते हैं।

कोड मैंने ऊपर दिया है, हालांकि, इसे ठीक नहीं करते हैं। जैसा कि यह पता चला है, HashSet<>जब मूल्य होता है तो समानता की तुलना भी कभी नहीं पूछेंगे null। यह स्रोत कोड से है HashSet<>:

    // Workaround Comparers that throw ArgumentNullException for GetHashCode(null).
    private int InternalGetHashCode(T item) {
        if (item == null) { 
            return 0;
        } 
        return m_comparer.GetHashCode(item) & Lower31BitMask; 
    }

इसका मतलब है कि, कम से कम HashSet<>, के हैश को बदलना भी संभव नहीं है nullइसके बजाय, एक समाधान इस तरह से अन्य सभी मूल्यों के हैश को बदलने के लिए है:

class NewerNullEnumEqComp<T> : EqualityComparer<T?> where T : struct
{
  public override bool Equals(T? x, T? y)
  {
    return Default.Equals(x, y);
  }
  public override int GetHashCode(T? x)
  {
    return x.HasValue ? 1 + Default.GetHashCode(x) : /* not seen by HashSet: */ 0;
  }
}

1
मैं दूसरा - बहुत अच्छा सवाल।
सचिन कायथ

26
शून्य के लिए हैश कोड शून्य क्यों नहीं होना चाहिए? एक हैश टकराव दुनिया का अंत नहीं है, आप जानते हैं।
हॉट लिप्स

3
सिवाय इसके कि यह एक सर्वविदित, काफी आम, टकराव है। ऐसा नहीं है कि यह बुरा है या यहां तक ​​कि एक समस्या का प्रमुख है, यह आसानी से बचा जा सकता है
क्रिस Pfohl

8
lol मैं क्यों सोच रहा हूं "अगर .NET फ्रेमवर्क एक पुल से कूदता है, तो क्या आप इसका पालन करेंगे?" ...
एडम हल्सवर्थ

3
जिज्ञासा से बाहर, एक अशक्त मौसम क्या होगा?
स्वदेवमन 23३

जवाबों:


25

जब तक nulls के लिए दिया गया हैश कोड टाइप के लिए सुसंगत है , तब तक आपको ठीक होना चाहिए। हैश कोड के लिए एकमात्र आवश्यकता यह है कि दो वस्तुओं को समान हैश कोड माना जाता है।

अशक्त के लिए 0 या -1 लौटा रहा है, इसलिए जब तक आप एक को चुनते हैं और इसे हर समय वापस करते हैं, तब तक काम करेगा। जाहिर है, गैर-अशक्त हैश कोड आपको शून्य के लिए जो भी मूल्य का उपयोग करते हैं उसे वापस नहीं करना चाहिए।

इसी तरह के सवाल:

शून्य क्षेत्रों पर GetHashCode?

जब ऑब्जेक्ट की पहचानकर्ता शून्य हो तो GetHashCode को क्या लौटना चाहिए?

इस के "रिमार्क्स" MSDN प्रविष्टि हैश कोड के आसपास अधिक विस्तार में जाता है। मर्मस्पर्शी, प्रलेखन किसी भी कवरेज या शून्य मान की चर्चा प्रदान नहीं करता है सब पर - यहां तक कि नहीं समुदाय सामग्री में।

एनम के साथ अपने मुद्दे को संबोधित करने के लिए, या तो गैर-शून्य पर लौटने के लिए हैश कोड को फिर से लागू करें, शून्य के बराबर एक डिफ़ॉल्ट "अज्ञात" एनम प्रविष्टि जोड़ें, या बस अशक्त एनम का उपयोग न करें।

दिलचस्प लगता है, वैसे।

एक अन्य समस्या जो मुझे आम तौर पर दिखाई देती है वह यह है कि हैश कोड 4 बाइट या बड़े प्रकार का प्रतिनिधित्व नहीं कर सकता है जो बिना अशक्त है कम से कम एक टकराव के(जितना आकार बढ़ता है)। उदाहरण के लिए, एक int का हैश कोड केवल int है, इसलिए यह पूर्ण int श्रेणी का उपयोग करता है। नल के लिए आप उस श्रेणी में क्या मूल्य चुनते हैं? आप जो भी चुनेंगे वह मूल्य के हैश कोड से ही टकराएगा।

अपने आप में टकराव जरूरी नहीं कि एक समस्या हो, लेकिन आपको यह जानना होगा कि वे वहां मौजूद हैं। हैश कोड केवल कुछ परिस्थितियों में उपयोग किए जाते हैं। जैसा कि MSDN पर डॉक्स में कहा गया है, हैश कोड अलग-अलग ऑब्जेक्ट के लिए अलग-अलग मान वापस करने की गारंटी नहीं है, इसलिए इसकी अपेक्षा नहीं की जानी चाहिए।


मुझे नहीं लगता कि आपके द्वारा लिंक किए गए प्रश्न पूरी तरह से समान हैं। जब आप Object.GetHashCode()अपने स्वयं के वर्ग (या संरचना) में ओवरराइड कर रहे होते हैं , तो आप जानते हैं कि यह कोड केवल तभी हिट होगा जब लोग वास्तव में आपकी कक्षा का एक उदाहरण होंगे । वह उदाहरण नहीं हो सकता null। यही कारण है कि की क्यों आप अपने ओवरराइड शुरू नहीं है Object.GetHashCode()के साथ if (this == null) return -1;वहाँ के बीच "किया जा रहा है एक अंतर है null" और "एक वस्तु कुछ क्षेत्रों हैं कि जिनके पास किया जा रहा है null"।
जेपी स्टिग नीलसन

आप कहते हैं: स्पष्ट रूप से, गैर-शून्य हैश कोड आपको शून्य के लिए जो भी मूल्य का उपयोग करते हैं उसे वापस नहीं करना चाहिए। यह आदर्श होगा, मैं सहमत हूं। और यही कारण है कि मैंने अपना प्रश्न पहली जगह में पूछा, क्योंकि जब भी हम एक एनम लिखते हैं T, तो (T?)nullऔर (T?)default(T)उसी हैश कोड (.NET के वर्तमान कार्यान्वयन में) होगा। इसे बदला जा सकता है यदि .NET के कार्यान्वयनकर्ता या तो हैश कोड null या हैश कोड एल्गोरिथ्म में बदल गए System.Enum
जेपी स्टिग नीलसन

मैं मानता हूं कि लिंक अशक्त आंतरिक क्षेत्रों के लिए थे। आप यह उल्लेख करते हैं कि यह IEqualityComparer <T> के लिए है, आपके कार्यान्वयन में हैश कोड अभी भी एक प्रकार के लिए विशिष्ट है इसलिए आप अभी भी उसी स्थिति में हैं, प्रकार के लिए संगतता। किसी भी प्रकार के नल के लिए समान हैश कोड लौटाने से कोई फर्क नहीं पड़ेगा क्योंकि नल के पास प्रकार नहीं है।
एडम हल्ड्सवर्थ

1
नोट: मैंने अपना प्रश्न दो बार अपडेट किया। यह पता चला है कि (कम से कम HashSet<>) यह हैश कोड को बदलने के लिए काम नहीं करता है null
जेपी स्टिग नीलसन

6

यह ध्यान रखें कि हैश कोड का उपयोग केवल समानता का निर्धारण करने में पहले-चरण के रूप में किया जाता है, और [है / नहीं] कभी नहीं (डी) को एक वास्तविक तथ्य के रूप में उपयोग किया जाता है कि क्या दो वस्तुएं समान हैं।

यदि दो वस्तुओं के हैश कोड समान नहीं हैं, तो उन्हें समान नहीं माना जाता है (क्योंकि हम मानते हैं कि अप्रतिस्पर्धी कार्यान्वयन सही है - अर्थात हम दूसरा अनुमान नहीं लगाते हैं)। यदि उनके पास समान हैश कोड है, तो फिर उन्हें वास्तविक समानता के लिए जांच की जानी चाहिए , जो आपके मामले में, nullऔर एनम मान विफल हो जाएगी।

परिणामस्वरूप - शून्य का उपयोग करना सामान्य मामले में किसी भी अन्य मूल्य जितना अच्छा है।

निश्चित रूप से, आपके एनम की तरह स्थितियां होंगी, जहां यह शून्य एक वास्तविक के साथ साझा किया जाता है मूल्य के हैश कोड के । सवाल यह है कि क्या, आपके लिए, एक अतिरिक्त तुलना का न्यूनतम ओवरहेड समस्याओं का कारण बनता है।

यदि ऐसा है, तो अपने विशेष प्रकार के लिए अशक्त के मामले के लिए अपने स्वयं के तुलनाकर्ता को परिभाषित करें, और यह सुनिश्चित करें कि एक शून्य मान हमेशा एक हैश कोड उत्पन्न करता है जो हमेशा एक ही होता है (बेशक!) और एक मूल्य जो अंतर्निहित द्वारा प्राप्त नहीं किया जा सकता है ! प्रकार का अपना हैश कोड एल्गोरिथ्म है। अपने स्वयं के प्रकारों के लिए, यह सक्षम है। दूसरों के लिए - शुभकामनाएँ :)


5

यह शून्य होना जरूरी नहीं है - यदि आप चाहते थे तो आप इसे 42 कर सकते हैं।

सभी कि मायने रखती है स्थिरता कार्यक्रम के निष्पादन के दौरान।

यह सिर्फ सबसे स्पष्ट प्रतिनिधित्व है, क्योंकि nullअक्सर आंतरिक रूप से शून्य के रूप में प्रतिनिधित्व किया जाता है। जिसका अर्थ है, डिबगिंग करते समय, यदि आप शून्य का हैश कोड देखते हैं, तो यह आपको सोचने के लिए प्रेरित कर सकता है, "हम्म .. यह एक शून्य संदर्भ मुद्दा था?"

ध्यान दें कि यदि आप किसी संख्या का उपयोग करते हैं 0xDEADBEEF, तो कोई कह सकता है कि आप एक जादू नंबर का उपयोग कर रहे हैं ... और आप किस तरह के होंगे। (आप कह सकते हैं कि शून्य एक जादू की संख्या भी है, और आप एक तरह से सही होंगे ... सिवाय इसके कि इसे व्यापक रूप से नियम के अपवाद के रूप में इस्तेमाल किया जाए।)


4

अच्छा प्रश्न।

मैंने इसे कोड करने की कोशिश की:

enum Season
{
  Spring,
  Summer,
  Autumn,
  Winter,
}

और इसे इस तरह निष्पादित करें:

Season? v = null;
Console.WriteLine(v);

यह लौट आता है null

अगर मैं करता हूं, सामान्य के बजाय

Season? v = Season.Spring;
Console.WriteLine((int)v);

यदि हम कास्टिंग से बचते हैं 0, तो यह वापसी , जैसा कि अपेक्षित है, या सरल वसंत है int

तो .. यदि आप निम्न कार्य करते हैं:

Season? v = Season.Spring;  
Season? vnull = null;   
if(vnull == v) // never TRUE

संपादित करें

से MSDN

यदि दो ऑब्जेक्ट समान के रूप में तुलना करते हैं, तो प्रत्येक ऑब्जेक्ट के लिए GetHashCode विधि को समान मान वापस करना होगा। हालाँकि, यदि दो ऑब्जेक्ट्स की तुलना समान नहीं है, तो दो ऑब्जेक्ट के लिए GetHashCode विधियों को अलग-अलग मानों को वापस नहीं करना है

दूसरे शब्दों में: यदि दो वस्तुओं का समान हैश कोड है, जिसका अर्थ यह नहीं है कि वे समान हैं, क्योंकि वास्तविक समानता इक्वाल्स द्वारा निर्धारित की जाती है

MSDN से फिर:

किसी ऑब्जेक्ट के लिए GetHashCode विधि को लगातार उसी हैश कोड को वापस करना चाहिए जब तक कि ऑब्जेक्ट राज्य के लिए कोई संशोधन नहीं होता है जो ऑब्जेक्ट के बराबर पद्धति के रिटर्न मूल्य को निर्धारित करता है। ध्यान दें कि यह केवल किसी एप्लिकेशन के वर्तमान निष्पादन के लिए सही है, और यदि एप्लिकेशन को फिर से चलाया जाए तो एक अलग हैश कोड वापस किया जा सकता है।


6
एक टकराव, परिभाषा के अनुसार, दो असमान वस्तुओं का एक ही हैशकोड होता है। आपने प्रदर्शित किया है कि वस्तुएँ समान नहीं हैं। अब क्या उनके पास समान हैश कोड है? ओपी के अनुसार वे करते हैं, मतलब यह एक टकराव है। अब, यह टकराव की दुनिया का अंत नहीं है, यह केवल एक संभावित टकराव की तुलना में है यदि शून्य को 0 के अलावा किसी अन्य चीज़ के लिए बंद कर दिया जाए, जो प्रदर्शन को नुकसान पहुंचाता है।
'15:55

1
तो आपका जवाब वास्तव में क्या कहता है? आप कहते हैं कि Season.Spring शून्य के बराबर नहीं है। खैर, यह गलत नहीं है, लेकिन यह वास्तव में किसी भी तरह से इस सवाल का जवाब नहीं देता है।
Servy

2
@ सर्वे: सवाल कहता है: कि मेरे पास 2 अलग-अलग ऑब्जेक्ट ( नल और स्प्रिंग ) के लिए एक ही हैकोड क्यों है । तो जवाब है कि समान हैशकोड होने के कारण टक्कर का कारण नहीं है , वे समान नहीं हैं, वैसे।
तिगरान

3
"उत्तर: क्यों नहीं?" खैर, ओपी ने पूर्व में "क्यों नहीं" के आपके प्रश्न का उत्तर दिया। यह एक और संख्या की तुलना में टकराव पैदा करने की अधिक संभावना है। वह सोच रहा था कि क्या कोई कारण था 0 चुना गया था, और किसी ने अभी तक इसका जवाब नहीं दिया है।
'17:56

1
इस उत्तर में ऐसा कुछ भी नहीं है जिसे ओपी पहले से नहीं जानता है, जिस तरह से सवाल पूछा गया था उससे स्पष्ट है।
कोनराड रुडोल्फ

4

लेकिन क्या कोई कारण है कि शून्य का हैश कोड 0 होना चाहिए?

यह कुछ भी हो सकता था। मैं सहमत हूँ कि 0 जरूरी नहीं कि सबसे अच्छा विकल्प था, लेकिन यह एक है जो शायद सबसे कम कीड़े की ओर जाता है।

एक हैश फ़ंक्शन बिल्कुल उसी मान के लिए उसी हैश को वापस करना चाहिए । एक बार एक घटक मौजूद होता है जो ऐसा करता है, यह वास्तव में हैश के लिए एकमात्र वैध मूल्य है null। यदि इसके लिए एक स्थिरांक थे, जैसे, एचएम object.HashOfNull, तो किसी को लागू IEqualityComparerकरने वाले को उस मूल्य का उपयोग करने के लिए जानना होगा। यदि वे इसके बारे में नहीं सोचते हैं, तो वे जिस अवसर का उपयोग करेंगे, वह हर दूसरे मूल्य से थोड़ा अधिक है, मैं मानता हूं।

कम से कम हैशसेट <> के लिए, अशक्त के हैश को बदलना भी संभव नहीं है

जैसा कि ऊपर उल्लेख किया गया है, मुझे लगता है कि यह पूरी तरह से असंभव पूर्ण विराम है, सिर्फ इसलिए कि ऐसे प्रकार मौजूद हैं जो पहले से ही उस सम्मेलन का पालन करते हैं जो शून्य का हैश है 0।


जब कोई EqualityComparer<T>.GetHashCode(T)कुछ विशेष प्रकार के लिए विधि लागू करता है Tजो अनुमति देता है null, तो किसी को तर्क करने के लिए कुछ करना पड़ता है null। आप (1) ए ArgumentNullException, (2) रिटर्न फेंक सकते हैं 0, या (3) कुछ और वापस कर सकते हैं। मैं हमेशा 0उस स्थिति में लौटने के लिए एक सिफारिश के लिए आपका जवाब लेता हूं ?
जेपी स्टिग नील्सन

@JeppeStigNielsen मैं फेंक बनाम वापसी के बारे में निश्चित नहीं हूं, लेकिन यदि आप वापसी करना चुनते हैं, तो निश्चित रूप से शून्य हैं।
रोमन स्टार्कोव 20

2

यह सादगी के लिए 0 है। ऐसी कोई सख्त आवश्यकता नहीं है। आपको केवल हैश कोडिंग की सामान्य आवश्यकताओं को सुनिश्चित करने की आवश्यकता है।

उदाहरण के लिए, आपको यह सुनिश्चित करने की आवश्यकता है कि यदि दो वस्तुएं समान हैं, तो उनके हैशकोड हमेशा समान होने चाहिए । इसलिए, अलग-अलग हैशकोड को हमेशा अलग-अलग ऑब्जेक्ट्स का प्रतिनिधित्व करना चाहिए (लेकिन यह जरूरी नहीं कि सच है इसके विपरीत: दो अलग-अलग ऑब्जेक्ट्स में एक ही हैशकोड हो सकता है, भले ही ऐसा अक्सर होता है तो यह एक अच्छी गुणवत्ता वाला हैश फ़ंक्शन नहीं है - यह एक नहीं है अच्छा टक्कर प्रतिरोध)।

बेशक, मैंने गणितीय प्रकृति की आवश्यकताओं के लिए अपने उत्तर को प्रतिबंधित कर दिया। .NET-विशिष्ट, तकनीकी स्थितियां भी हैं, जिन्हें आप यहां पढ़ सकते हैं । शून्य मान के लिए 0 उनमें से नहीं है।


1

तो यह एक UnknownEnum मान का उपयोग करके बचा जा सकता है (हालांकि यह Seasonअज्ञात होने के लिए थोड़ा अजीब लगता है )। तो ऐसा कुछ इस मुद्दे को नकार देगा:

public enum Season
{
   Unknown = 0,
   Spring,
   Summer,
   Autumn,
   Winter
}

Season some_season = Season.Unknown;
int code = some_season.GetHashCode(); // 0
some_season = Season.Autumn;
code = some_season.GetHashCode(); // 3

तब आपके पास प्रत्येक सीज़न के लिए अद्वितीय हैश कोड मान होंगे।


1
हाँ, लेकिन यह वास्तव में सवाल नहीं है। इस तरह से प्रश्न के अनुसार अशक्त Uknown के साथ टकरा जाएगा। एक अलग क्या है?
Tigran

@ टाइगरन - इस संस्करण में एक
अशक्त

मैं देखता हूं, लेकिन सवाल अशक्त प्रकार के बारे में है।
Tigran

मेरे पास एसओ पर एक लाख बार दृश्य है कि लोग उत्तर के रूप में सुधार के लिए सुझाव देते हैं।
स्वदेवमन 23३

1

व्यक्तिगत रूप से मैं अशक्त मूल्यों का उपयोग कर थोड़ा अजीब लगता हूं और जब भी मैं उनसे बचने की कोशिश कर सकता हूं। आपका मुद्दा सिर्फ एक और कारण है। कभी-कभी वे बहुत आसान होते हैं, लेकिन मेरे अंगूठे का नियम नल के साथ मूल्य प्रकारों को मिश्रण करना नहीं है यदि संभव हो तो बस क्योंकि ये दो अलग-अलग दुनिया से हैं। .NET फ्रेमवर्क में वे ऐसा ही करते हैं - बहुत से मूल्य प्रकार TryParseविधि प्रदान करते हैं जो मानों को बिना मूल्य ( null) से अलग करने का एक तरीका है ।

आपके विशेष मामले में समस्या से छुटकारा पाना आसान है क्योंकि आप अपने Seasonप्रकार को संभालते हैं ।

(Season?)nullमेरे लिए 'मौसम निर्दिष्ट नहीं है' जैसे कि जब आपके पास एक वेबफॉर्म होता है जहां कुछ क्षेत्रों की आवश्यकता नहीं होती है। मेरी राय में उस विशेष 'मूल्य' को अपने enumआप में निर्दिष्ट करना बेहतर है बजाय इसके कि थोड़ा क्लंकी का उपयोग करें Nullable<T>। यह तेजी से (कोई मुक्केबाजी नहीं) पढ़ना आसान होगा ( Season.NotSpecifiedबनाम null) और हैश कोड के साथ आपकी समस्या का समाधान करेगा।

निश्चित रूप से अन्य प्रकारों के लिए, जैसे intआप मूल्य डोमेन का विस्तार नहीं कर सकते हैं और एक मान को संप्रदायित करना है क्योंकि विशेष हमेशा संभव नहीं होता है। लेकिन int?हैश कोड टकराव के साथ बहुत छोटी समस्या है, अगर बिल्कुल भी।


जब आप "मुक्केबाजी" कहते हैं, तो मुझे लगता है कि आप "रैपिंग" से मतलब रखते हैं, अर्थात एक संरचना के अंदर एक Nullable<>संरचनात्मक मूल्य डालते हैं (जहां HasValueसदस्य फिर सेट हो जाएगा true)। क्या आप सुनिश्चित हैं कि समस्या वास्तव में छोटी है int?? बहुत समय एक व्यक्ति केवल कुछ मूल्यों का उपयोग करता है int, और फिर यह एक एनम के बराबर है (जो सिद्धांत में कई सदस्य हो सकते हैं)।
जेपी स्टिग नीलसन

आम तौर पर मैं कहूंगा कि Enum को तब चुना जाता है जब सीमित संख्या में आवश्यक मान (2-10) हो। यदि सीमा बड़ी है या कोई नहीं है, तो intअधिक समझ में आता है। बेशक प्राथमिकताएं बदलती हैं।
Maciej

0
Tuple.Create( (object) null! ).GetHashCode() // 0
Tuple.Create( 0 ).GetHashCode() // 0
Tuple.Create( 1 ).GetHashCode() // 1
Tuple.Create( 2 ).GetHashCode() // 2

1
यह एक दिलचस्प दृष्टिकोण है। कुछ अतिरिक्त स्पष्टीकरण और विशेष रूप से प्रश्न की प्रकृति को शामिल करने के लिए अपने उत्तर को संपादित करना उपयोगी होगा।
जेरेमी कैनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.