এনট 3.5.৫ এ এনামকে স্ট্রিংয়ে রূপান্তর করার পছন্দের উপায় কোনটি?
- Enum.GetName
- Enum.Format
- স্ট্রিং
আমি কেন এর অন্যটির চেয়ে বেশি পছন্দ করব? কেউ কি আরও ভাল পারফর্ম করে?
এনট 3.5.৫ এ এনামকে স্ট্রিংয়ে রূপান্তর করার পছন্দের উপায় কোনটি?
আমি কেন এর অন্যটির চেয়ে বেশি পছন্দ করব? কেউ কি আরও ভাল পারফর্ম করে?
উত্তর:
সি # 6 হিসাবে এনামের নাম পাওয়ার সর্বোত্তম উপায় হ'ল নতুন nameof
অপারেটর:
nameof(MyEnum.EnumValue);
// Ouputs
> "EnumValue"
এটি সংকলনের সময়ে এনামগুলি সংকলিত ফলাফলের স্ট্রিং দ্বারা প্রতিস্থাপনের সাথে কাজ করে, যার পরিবর্তে এটি সম্ভবত দ্রুততম উপায় the
এনাম নামগুলির যে কোনও ব্যবহার কোড প্ররোচনার সাথে হস্তক্ষেপ করে না, যদি আপনি এনাম নামগুলি অবহেলা বিবেচনা করে সার্থক বা গুরুত্বপূর্ণ হিসাবে বিবেচনা করেন - তবে সম্ভবত এটি সম্পূর্ণ অন্য একটি প্রশ্ন।
nameof(variableEnum)
হতে হবে "variableEnum"
। এটা তোলে (বিল্ড সময়ে) প্রতিফলিত করে নাম ক্ষেত্র / সম্পত্তি / PARAM / পরিবর্তনশীল না মান ।
"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 টি মান সহ এনাম no পুনরাবৃত্তির = 1000000
ফলাফল : এনাম.গেটনাম => 700 এমএস, টোস্ট্রিং => 2000 এমএস
যদি গতি লক্ষণীয় না হয়, তবে আমি এটি যত্ন ও ব্যবহার করব না ToString
কারণ এটি অনেক বেশি ক্লিনার কল দেয়। কনট্রাস্ট
Enum.GetName(typeof(Bla), value)
সঙ্গে
value.ToString()
এটি এর জন্য বোঝানো সবচেয়ে মার্জিত পদ্ধতি।
var enumValueString = Enum.GetName(typeof (MyEnum), MyEnum.MyValue);
যদিও আমি কলিংয়ের সাথে কোনও সমস্যা দেখতে পাচ্ছি না .ToString()
কারণ এটি সহজতর খাটো।
var enumValueString = MyEnum.MyValue.ToString();
নতুন সি # 6 সিনট্যাক্স সহ আপনি ব্যবহার করতে পারেন:
nameof(MyEnum.MyValue)
এই সমস্ত অভ্যন্তরীণভাবে ডাকা একটি পদ্ধতি কল করে InternalGetValueAsString
। ToString
এবং এর মধ্যে পার্থক্য হ'ল প্রথমে কয়েকটি জিনিস যাচাই GetName
করতে হবে GetName
:
GetType
পরীক্ষা করে মান ব্যবহার করে।.ToString
উপরোক্ত বিষয়গুলির যে কোনওটির বিষয়ে চিন্তা করার দরকার নেই, কারণ এটি শ্রেণীর নিজেই একটি উদাহরণ হিসাবে ডাকা হয়েছিল, এবং সংস্করণে উত্তীর্ণ নয়, অতএব, .ToString
পদ্ধতিটির একই যাচাইকরণের সমস্যা নেই এই কারণে স্থির পদ্ধতি হিসাবে, আমি উপসংহারে পৌঁছাতে পারি যে .ToString
স্ট্রিং হিসাবে মানটি অর্জন করার দ্রুততম উপায়।
এমএসডিএন- এ এই সম্পর্কিত সম্পর্কিত প্রশ্নটি আমি খুঁজে পেতে পারি , যার মধ্যে একটি এক্সএমএল স্নিপেট রয়েছে যা এই প্রশ্নের উত্তর দেয়। এর মধ্যে যে কোনও একটি পদ্ধতি একই ত্রুটি ভাগ করে নেয়: তারা কল করে 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()
আরও ভাল।
পারফরম্যান্স যদি সত্যই আপনার লক্ষ্য হয় তবে আগে থেকে চেহারা (কোনও অভিধান বা অন্য কোনও ম্যাপিং ব্যবহার করে) দেওয়া আরও ভাল।
সি ++ / সিএলআই-তে এটি দেখতে ভালো লাগবে
Dictionary<String^, MyEnum> mapping;
for each (MyEnum field in Enum::GetValues(MyEnum::typeid))
{
mapping.Add(Enum::GetName(MyEnum::typeid), field);
}
100 আইটেম এবং 1000000 পুনরাবৃত্তির একটি এনাম ব্যবহার করে তুলনা:
Enum.GetName: ms 800ms
.ToString (): ~ 1600ms
অভিধান ম্যাপিং: ~ 250ms