आप दोनों के बीच प्रदर्शन में एक बड़ा अंतर नहीं देख पाएंगे, लेकिन मैं अभी भी एक शब्दकोश का उपयोग करने की सिफारिश करता हूं क्योंकि यह आपको भविष्य में थोड़ा अधिक लचीलापन देगा।
एक बात के लिए, सी # में एनम स्वचालित रूप से जावा में इसके साथ जुड़ी कक्षा नहीं हो सकती है, इसलिए यदि आप अतिरिक्त जानकारी को एक राज्य (पूर्ण नाम, पूंजीगत शहर, डाक संक्षेप इत्यादि) से जोड़ना चाहते हैं। , UnitedState
कक्षा बनाने से यह सारी जानकारी एक संग्रह में पैकेज करना आसान हो जाएगी।
इसके अलावा, भले ही आप सोचें यह मान कभी नहीं बदलेगा, यह पूरी तरह से अपरिवर्तनीय नहीं है। उदाहरण के लिए, आप क्षेत्रों को शामिल करने के लिए कल्पना की एक नई आवश्यकता हो सकती है। या शायद आपको कनाडाई उपयोगकर्ताओं को इसके बजाय कनाडाई प्रांतों के नाम देखने की अनुमति देनी होगी। यदि आप इस संग्रह को डेटा के किसी भी अन्य संग्रह की तरह मानते हैं (इसके द्वारा मूल्यों को पुनर्प्राप्त करने के लिए एक भंडार का उपयोग करके), तो बाद में आपके पास एक अलग स्रोत (डेटाबेस, वेब सेवा, सत्र इत्यादि) से मूल्य खींचने के लिए आपके भंडार कार्यान्वयन को बदलने का विकल्प होगा।)। Enums बहुत कम बहुमुखी हैं।
संपादित
प्रदर्शन तर्क के बारे में: ध्यान रखें कि आप सिर्फ नहीं कर रहे हैं किसी पूर्णांक के लिए एक Enum कास्टिंग: आप यह भी कहा कि enum है, जो काफी प्रसंस्करण समय कहते हैं पर toString() चला रहे हैं। निम्न परीक्षण पर विचार करें:
const int C = 10000;
int[] ids = new int[C];
string[] names = new string[C];
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i< C; i++)
{
var id = (i % 50) + 1;
names[i] = ((States)id).ToString();
}
sw.Stop();
Console.WriteLine("Enum: " + sw.Elapsed.TotalMilliseconds);
var namesById = Enum.GetValues(typeof(States)).Cast<States>()
.ToDictionary(s => (int) s, s => s.ToString());
sw.Restart();
for (int i = 0; i< C; i++)
{
var id = (i % 50) + 1;
names[i] = namesById[id];
}
sw.Stop();
Console.WriteLine("Dictionary: " + sw.Elapsed.TotalMilliseconds);
परिणाम:
Enum: 26.4875
Dictionary: 0.7684
तो अगर प्रदर्शन वास्तव में अपनी प्राथमिक चिंता का विषय है, एक शब्दकोश निश्चित रूप से जाने के लिए रास्ता है। हालांकि, हम इस तरह के तेज समय के बारे में बात कर रहे हैं कि आधे दर्जन अन्य चिंताएं हैं जिन्हें मैं संबोधित करता हूं इससे पहले कि मैं गति मुद्दे की भी देखभाल करूंगा।
सी # में एनम्स को मूल्यों और तारों के बीच मैपिंग प्रदान करने के लिए डिज़ाइन नहीं किया गया था। वे दृढ़ता से टाइप किए गए निरंतर मान प्रदान करने के लिए डिज़ाइन किए गए थे जिन्हें आप कोड में पास कर सकते हैं। इस के दो मुख्य फायदे हैं:
- आप एक अतिरिक्त संकलक जाँच मदद से आप गलत क्रम में तर्क गुजर से बचने के सुराग है, आदि
- बजाय डाल "जादुई" संख्या मान (उदाहरण के लिए "42 ") अपने कोड में, आप" स्टेट्स.ऑक्लाहोमा "कह सकते हैं, जो आपके कोड को अधिक पठनीय प्रस्तुत करता है।
जावा के विपरीत, सी # स्वचालित रूप से डाली मूल्यों सुनिश्चित करें कि वे वैध (myState = (States)321
) कर रहे हैं की जाँच नहीं करता है, तो आप उन्हें मैन्युअल कर बिना आदानों पर किसी भी क्रम डेटा चेकों नहीं मिलता है। यदि आपके पास कोड नहीं है जो राज्यों को स्पष्ट रूप से संदर्भित करता है ("स्टेट्स.ऑक्लाहोमा"), तो आपको ऊपर # 2 से कोई मूल्य नहीं मिलता है। यह हमें enums का उपयोग करने के लिए एकमात्र वास्तविक कारण के रूप में # 1 के साथ छोड़ देता है। यदि यह आपके लिए पर्याप्त कारण है, तो मैं आपके प्रमुख मानों के रूप में की बजाय enms का उपयोग करने का सुझाव दूंगा। फिर, जब आपको किसी स्ट्रिंग या राज्य से संबंधित कुछ अन्य मूल्य की आवश्यकता होती है, तो एक शब्दकोश लुकअप करें।
यहाँ कैसे मैं यह कर करेंगे:
public enum StateKey{
AL = 1,AK,AS,AZ,AR,CA,CO,CT,DE,DC,FM,FL,GA,GU,
HI,ID,IL,IN,IA,KS,KY,LA,ME,MH,MD,MA,MI,MN,MS,
MO,MT,NE,NV,NH,NJ,NM,NY,NC,ND,MP,OH,OK,OR,PW,
PA,PR,RI,SC,SD,TN,TX,UT,VT,VI,VA,WA,WV,WI,WY,
}
public class State
{
public StateKey Key {get;set;}
public int IntKey {get {return (int)Key;}}
public string PostalAbbreviation {get;set;}
}
public interface IStateRepository
{
State GetByKey(StateKey key);
}
public class StateRepository : IStateRepository
{
private static Dictionary<StateKey, State> _statesByKey;
static StateRepository()
{
_statesByKey = Enum.GetValues(typeof(StateKey))
.Cast<StateKey>()
.ToDictionary(k => k, k => new State {Key = k, PostalAbbreviation = k.ToString()});
}
public State GetByKey(StateKey key)
{
return _statesByKey[key];
}
}
public class Foo
{
IStateRepository _repository;
// Dependency Injection makes this class unit-testable
public Foo(IStateRepository repository)
{
_repository = repository;
}
// If you haven't learned the wonders of DI, do this:
public Foo()
{
_repository = new StateRepository();
}
public void DoSomethingWithAState(StateKey key)
{
Console.WriteLine(_repository.GetByKey(key).PostalAbbreviation);
}
}
इस तरह:
- अपने चारों ओर दृढ़ता से टाइप मूल्यों है कि एक राज्य का प्रतिनिधित्व पारित करने के लिए मिलता है,
- अपने देखने fail- हो जाता है तेजी से व्यवहार अगर इसे अमान्य इनपुट दिया जाता है,
- आप आसानी से बदल सकते हैं कि वास्तविक स्थिति डेटा भविष्य में रहता है,
- आप भविष्य में राज्य से संबंधित डेटा को आसानी से जोड़ सकते हैं,
- आप आसानी से नए राज्य, क्षेत्र, जिलों, प्रांतों, या भविष्य में जो कुछ भी जोड़ सकते हैं।
- एक int से नाम प्राप्त करने के बारे में
Enum.ToString()
का उपयोग करते समय लगभग 1512 तेज है।
[घुरघुराना]
का उपयोग क्यों कर सकते हैं आपको उन्हें क्यों डालना होगा? – LukeH
@LukeH: संभवत: डेटाबेस में मान केवल पूर्णांक होंगे। –
@ जोन: मैंने यही अनुमान लगाया है, लेकिन ओपी से स्पष्टीकरण प्राप्त करना अच्छा होगा। – LukeH