পারফরম্যান্স বিষয়
আপনি যদি আরও ভাল পারফরম্যান্স চান তবে এটি যাওয়ার উপায়:
public static class AdvancedEnumExtensions
{
/// <summary>
/// Gets the custom attribute <typeparamref name="T"/> for the enum constant, if such a constant is defined and has such an attribute; otherwise null.
/// </summary>
public static T GetCustomAttribute<T>(this Enum value) where T : Attribute
{
return GetField(value)?.GetCustomAttribute<T>(inherit: false);
}
/// <summary>
/// Gets the FieldInfo for the enum constant, if such a constant is defined; otherwise null.
/// </summary>
public static FieldInfo GetField(this Enum value)
{
ulong u64 = ToUInt64(value);
return value
.GetType()
.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)
.Where(f => ToUInt64(f.GetRawConstantValue()) == u64)
.FirstOrDefault();
}
/// <summary>
/// Checks if an enum constant is defined for this enum value
/// </summary>
public static bool IsDefined(this Enum value)
{
return GetField(value) != null;
}
/// <summary>
/// Converts the enum value to UInt64
/// </summary>
public static ulong ToUInt64(this Enum value) => ToUInt64((object)value);
private static ulong ToUInt64(object value)
{
switch (Convert.GetTypeCode(value))
{
case TypeCode.SByte:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
return unchecked((ulong)Convert.ToInt64(value, CultureInfo.InvariantCulture));
case TypeCode.Byte:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
case TypeCode.Char:
case TypeCode.Boolean:
return Convert.ToUInt64(value, CultureInfo.InvariantCulture);
default: throw new InvalidOperationException("UnknownEnumType");
}
}
}
এটির কেন আরও ভাল পারফরম্যান্স রয়েছে?
কারণ অন্তর্নির্মিত পদ্ধতিগুলিতে সমস্ত কোড এর সাথে খুব একই রকম ব্যবহার করে তবে তারা আমাদের অন্যান্য যত্ন নিয়ে যত্ন নিয়ে নয় এমন অন্যান্য কোডগুলিও চালায় । সি # এর এনুম কোডটি সাধারণভাবে বেশ ভয়ঙ্কর।
উপরের কোডটি লিনাক-আইয়েড এবং প্রবাহিত হয়েছে সুতরাং এতে কেবল আমাদের যত্ন করা বিট রয়েছে।
বিল্ট ইন কোডটি মন্থর কেন?
এনাম.টোস্ট্রিং () -vs- এনাম.গেটনাম (..) সম্পর্কিত প্রথম
সর্বদা পরেরটি ব্যবহার করুন। (বা আরও ভাল, নিচে পরিষ্কার হয়ে যাবে হিসাবে।)
টোস্ট্রিং () উত্তরোত্তরটি অভ্যন্তরীণভাবে ব্যবহার করে, তবে আবারও, আমরা চাই না এমন অন্যান্য জিনিসগুলির একটি গুচ্ছও ব্যবহার করে, যেমন পতাকাগুলি একত্রিত করার চেষ্টা করে, সংখ্যাগুলি প্রিন্ট আউট ইত্যাদি We আমরা কেবল এনামের ভিতরে সংজ্ঞায়িত ধ্রুবকগুলিতে আগ্রহী।
Enum.GetName পরিবর্তে সমস্ত ক্ষেত্র পায়, সমস্ত নামের জন্য একটি স্ট্রিং অ্যারে তৈরি করে, সমস্ত মানগুলির একটি UInt64 অ্যারে তৈরি করতে তাদের সমস্ত RawConstantValues উপরের ToUInt64 ব্যবহার করে, UInt64 মান অনুসারে উভয় অ্যারে সাজিয়ে তোলে এবং শেষ পর্যন্ত নামটি পেয়ে যায় আমরা যে মানটি চেয়েছিলাম তার সূচকটি খুঁজে পেতে UInt64-অ্যারে বাইনারি অনুসন্ধান করে নাম অ্যারে।
... এবং তারপরে আমরা ক্ষেত্রগুলি ছুঁড়ে ফেলেছি এবং সাজানো অ্যারেগুলি আবার ক্ষেত্র সন্ধানের জন্য সেই নামটি ব্যবহার করে।
একটি শব্দ: "উঘ!"