.NET 3.5 में Enum को String में बदलने का पसंदीदा तरीका कौन सा है?
- Enum.GetName
- Enum.Format
- तार
मुझे इनमें से किसी एक को क्यों पसंद करना चाहिए? क्या कोई बेहतर प्रदर्शन करता है?
.NET 3.5 में Enum को String में बदलने का पसंदीदा तरीका कौन सा है?
मुझे इनमें से किसी एक को क्यों पसंद करना चाहिए? क्या कोई बेहतर प्रदर्शन करता है?
जवाबों:
सी # 6 के रूप में एक एनम का नाम पाने का सबसे अच्छा तरीका नया nameof
ऑपरेटर है:
nameof(MyEnum.EnumValue);
// Ouputs
> "EnumValue"
यह संकलित समय पर काम करता है, संकलित परिणाम में स्ट्रिंग द्वारा प्रतिस्थापित किया जा रहा है, जो बदले में इसका मतलब है कि यह सबसे तेज़ तरीका संभव है।
एनम नामों का कोई भी उपयोग कोड ऑब्सफैक्शन के साथ हस्तक्षेप नहीं करता है, यदि आप एनम नामों के स्थापन को सार्थक या महत्वपूर्ण मानते हैं - तो यह संभवतः एक संपूर्ण अन्य प्रश्न है।
nameof(variableEnum)
होगा "variableEnum"
। यह क्षेत्र (संपत्ति / समय / पैराम / चर ) का नाम दर्शाता है ( मूल्य नहीं) ।
"someEnumValue"
, जबकि आपको nameof(SomeEnum.FooBar)
प्राप्त करने की आवश्यकता होगी "FooBar"
।
हमारी परियोजना के लिए काम करता है ...
public static String convertToString(this Enum eff)
{
return Enum.GetName(eff.GetType(), eff);
}
public static EnumType converToEnum<EnumType>(this String enumValue)
{
return (EnumType) Enum.Parse(typeof(EnumType), enumValue);
}
मेरे परीक्षणों में, Enum.GetName
तेज और सभ्य मार्जिन के द्वारा किया गया था। आंतरिक रूप से ToString
कॉल करता है Enum.GetName
। .NET 4.0 के लिए स्रोत से , आवश्यक:
public override String ToString()
{
return Enum.InternalFormat((RuntimeType)GetType(), GetValue());
}
private static String InternalFormat(RuntimeType eT, Object value)
{
if (!eT.IsDefined(typeof(System.FlagsAttribute), false))
{
String retval = GetName(eT, value); //<== the one
if (retval == null)
return value.ToString();
else
return retval;
}
else
{
return InternalFlagsFormat(eT, value);
}
}
मैं यह नहीं कह सकता कि यह सुनिश्चित करने का कारण है, लेकिन परीक्षण एक दूसरे से तेज है। दोनों कॉल में बॉक्सिंग शामिल है (वास्तव में वे प्रतिबिंब कॉल हैं, आप अनिवार्य रूप से फ़ील्ड नामों को पुनः प्राप्त कर रहे हैं) और आपकी पसंद के लिए धीमा हो सकता है।
टेस्ट सेटअप : 8 मानों के साथ एनम, नं। पुनरावृत्तियों का = १००००००
परिणाम : Enum.GetName => 700 ms, ToString => 2000 ms
यदि गति ध्यान देने योग्य नहीं है, तो मैं इसकी देखभाल और उपयोग नहीं करूंगा ToString
क्योंकि यह बहुत अधिक क्लीनर कॉल प्रदान करता है। कंट्रास्ट
Enum.GetName(typeof(Bla), value)
साथ में
value.ToString()
यह सबसे सुंदर तरीका है जो इसके लिए है।
var enumValueString = Enum.GetName(typeof (MyEnum), MyEnum.MyValue);
हालाँकि मुझे कॉलिंग के साथ कोई समस्या नहीं दिख रही है .ToString()
क्योंकि यह केवल छोटा है।
var enumValueString = MyEnum.MyValue.ToString();
नए C # 6 सिंटैक्स के साथ आप इसका उपयोग कर सकते हैं:
nameof(MyEnum.MyValue)
इन सभी को आंतरिक रूप से एक विधि कहा जाता है InternalGetValueAsString
। के बीच का अंतर ToString
और GetName
हो सकता है कि GetName
पहले कुछ चीजें सत्यापित करने के लिए है:
GetType
जांचने के लिए इसका उपयोग मूल्य पर किया जाता है।.ToString
इन उपरोक्त मुद्दों में से किसी के बारे में चिंता करने की ज़रूरत नहीं है, क्योंकि इसे स्वयं कक्षा के एक उदाहरण पर कहा जाता है, और संस्करण में पारित नहीं होने पर, इसलिए, इस तथ्य के कारण कि .ToString
विधि में एक ही सत्यापन समस्या नहीं है स्थिर तरीकों के रूप में, मैं निष्कर्ष निकालूंगा कि .ToString
एक स्ट्रिंग के रूप में मूल्य प्राप्त करने का सबसे तेज़ तरीका है।
सबसे अच्छा मुझे मिल सकता है यह MSDN पर असंबंधित प्रश्न है , जिसमें एक XML स्निपेट शामिल है जो इस प्रश्न का उत्तर देता है। इनमें से कोई भी विधि समान दोष साझा करती है: वे कॉल करते हैं enum.toString()
, जो डॉटफ़सकेशन का उपयोग करते समय ठीक से काम नहीं करते हैं । अन्य चिंताएं अप्रत्यक्ष मुक्केबाजी (गेटनेम और प्रारूप) से संबंधित हैं। दुर्भाग्य से, मैं ऊपर दिए गए किसी भी उपयोग के लिए कोई प्रदर्शन कारण नहीं खोज सकता।
एक्सएमएल स्निपेट से पैराफ्रेसिंग ,
एक बॉक्सिंग एनम को स्ट्रिंग करने के लिए पास करना। फ़र्मैट () या किसी अन्य फ़ंक्शन को
enum.ToString()
कॉल किया जा सकता है। इससे डॉटफ़स्कैटिंग करने पर समस्या होगी। आप उपयोग नहीं करना चाहिएenum.ToString()
,enum.GetNames()
,enum.GetName()
,enum.Format()
याenum.Parse()
एक स्ट्रिंग के लिए एक enum कन्वर्ट करने के लिए। इसके बजाय, एक स्विच स्टेटमेंट का उपयोग करें, और यदि आवश्यक हो तो नामों का अंतर्राष्ट्रीयकरण भी करें।
Enum.GetName()
Format()
वास्तव में GetName()
कुछ स्वरूपण कार्यक्षमता (या InternalGetValueAsString()
सटीक होना) के साथ वास्तव में सिर्फ एक आवरण है । ToString()
के रूप में बहुत ज्यादा है Format()
। मुझे लगता GetName()
है कि यह सबसे अच्छा विकल्प है क्योंकि यह पूरी तरह से स्पष्ट है कि यह स्रोत पढ़ने वाले किसी भी व्यक्ति के लिए क्या करता है।
मैं एक "विवरण" एक्सटेंशन विधि बनाता हूं और इसे एनम के साथ संलग्न करता हूं ताकि मैं वास्तव में उपयोगकर्ता के अनुकूल नामकरण प्राप्त कर सकूं जिसमें रिक्त स्थान और आवरण शामिल हैं। मैं कभी भी प्रदर्शन योग्य पाठ के रूप में एनम मूल्य का उपयोग करना पसंद नहीं करता हूं क्योंकि यह कुछ ऐसा है जिसे डेवलपर्स हम अधिक पठनीय कोड बनाने के लिए उपयोग करते हैं। यह यूआई प्रदर्शन उद्देश्यों के लिए अभिप्रेत नहीं है। मैं यूआई को बदलने में सक्षम होना चाहता हूं और सभी जगहों पर दुश्मनी को बदल सकता हूं।
ToString()
एक पठनीयता के दृष्टिकोण से सबसे स्पष्ट परिणाम देता है, जबकि उपयोग Enum.GetName()
करने के लिए थोड़ा और अधिक मानसिक रूप से समझने की आवश्यकता होती है कि वह क्या करने की कोशिश कर रहा है (जब तक कि आप हर समय पैटर्न नहीं देखते)।
शुद्ध प्रदर्शन के दृष्टिकोण से, जैसा कि पहले से ही @ नवाफ के जवाब में प्रदान किया गया है, Enum.GetName()
बेहतर है।
यदि प्रदर्शन वास्तव में आपका लक्ष्य है, तो पहले से एक लुक-अप प्रदान करना बेहतर होगा (एक शब्दकोश या कुछ अन्य मानचित्रण का उपयोग करके)।
C ++ / CLI में, यह ऐसा दिखेगा
Dictionary<String^, MyEnum> mapping;
for each (MyEnum field in Enum::GetValues(MyEnum::typeid))
{
mapping.Add(Enum::GetName(MyEnum::typeid), field);
}
100 वस्तुओं और 1000000 पुनरावृत्तियों की गणना के साथ तुलना:
Enum.GetName: ~ 800ms
.ToString (): ~ 1600ms
शब्दकोश मानचित्रण: ~ 250ms