উত্তর:
এই প্রশ্নের উত্তর দেওয়া উচিত, এবং তারপর কিছু।
যারা দ্বিতীয় if (obj.GetType() == typeof(ClassA)) {}
নিবন্ধটি পড়তে চান না তাদের জন্য দ্বিতীয় লাইনটি দ্রুত।
(সচেতন হন যে তারা একই জিনিস না করে)
typeof(string).TypeHandle
করতে ldtoken
CIL নির্দেশ, কিন্তু CLR জে আই টি JIT এটা যত্ন নেয় মত দেখায়। এটি এখনও কয়েকটি অতিরিক্ত অপকড নেয় তবে এটি অপটিমাইজেশনের আরও সাধারণ প্রয়োগ।
GetType
, is
সবসময় একটি নিরাপদ পছন্দ যতটা কর্মক্ষমতা আমাদের করেছেন। অবশ্যই তারা বিভিন্ন জিনিস করে।
object obj;
ভেরিয়েবল পরীক্ষা করছি , এটি পরীক্ষা করার ঝুঁকির আগেই বাক্সবন্দী হয় না? এমন কোনও মামলা রয়েছে যেখানে আপনাকে কোনও কিছুর ধরণের পরীক্ষা করতে হবে এবং এটি ইতিমধ্যে কোনও বস্তু হিসাবে চিহ্নিত করা হয়নি?
যদি তারা একই জিনিস না করে তবে কোনটি দ্রুততর তা বিবেচনা করে? বিবৃতিগুলির পারফরম্যান্সকে বিভিন্ন অর্থের সাথে তুলনা করা খারাপ ধারণা বলে মনে হয়।
is
আপনাকে জানায় যে বস্তুটি ClassA
তার ধরণের বৈধব্যক্তির যে কোনও জায়গায় প্রয়োগ করে । GetType()
আপনাকে সর্বাধিক উদ্ভূত প্রকারের সম্পর্কে জানায়।
একই জিনিস না।
তারা একই জিনিস না। প্রথমটি কাজ করে যদি আপত্তিটি ক্লাসএ বা ক্লাসএর কিছু উপক্লাসের হয়। দ্বিতীয়টি কেবল ক্লাসএ টাইপের বস্তুর সাথে মিলবে। দ্বিতীয়টি দ্রুততর হবে কারণ এটি ক্লাস শ্রেণিবদ্ধতা পরীক্ষা করতে হবে না।
তাদের জন্য যারা কারণটি জানতে চান তবে রেফারেন্সযুক্ত নিবন্ধটি পড়তে চান না বনাম typeof হয় ।
আমি কিছু বেঞ্চমার্কিং করেছি যেখানে তারা একই কাজ করে - সিল করা প্রকারগুলি।
var c1 = "";
var c2 = typeof(string);
object oc1 = c1;
object oc2 = c2;
var s1 = 0;
var s2 = '.';
object os1 = s1;
object os2 = s2;
bool b = false;
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
{
b = c1.GetType() == typeof(string); // ~60ms
b = c1 is string; // ~60ms
b = c2.GetType() == typeof(string); // ~60ms
b = c2 is string; // ~50ms
b = oc1.GetType() == typeof(string); // ~60ms
b = oc1 is string; // ~68ms
b = oc2.GetType() == typeof(string); // ~60ms
b = oc2 is string; // ~64ms
b = s1.GetType() == typeof(int); // ~130ms
b = s1 is int; // ~50ms
b = s2.GetType() == typeof(int); // ~140ms
b = s2 is int; // ~50ms
b = os1.GetType() == typeof(int); // ~60ms
b = os1 is int; // ~74ms
b = os2.GetType() == typeof(int); // ~60ms
b = os2 is int; // ~68ms
b = GetType1<string, string>(c1); // ~178ms
b = GetType2<string, string>(c1); // ~94ms
b = Is<string, string>(c1); // ~70ms
b = GetType1<string, Type>(c2); // ~178ms
b = GetType2<string, Type>(c2); // ~96ms
b = Is<string, Type>(c2); // ~65ms
b = GetType1<string, object>(oc1); // ~190ms
b = Is<string, object>(oc1); // ~69ms
b = GetType1<string, object>(oc2); // ~180ms
b = Is<string, object>(oc2); // ~64ms
b = GetType1<int, int>(s1); // ~230ms
b = GetType2<int, int>(s1); // ~75ms
b = Is<int, int>(s1); // ~136ms
b = GetType1<int, char>(s2); // ~238ms
b = GetType2<int, char>(s2); // ~69ms
b = Is<int, char>(s2); // ~142ms
b = GetType1<int, object>(os1); // ~178ms
b = Is<int, object>(os1); // ~69ms
b = GetType1<int, object>(os2); // ~178ms
b = Is<int, object>(os2); // ~69ms
}
sw.Stop();
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());
জেনেরিক ধরণের পরীক্ষার জন্য জেনেরিক ফাংশন:
static bool GetType1<S, T>(T t)
{
return t.GetType() == typeof(S);
}
static bool GetType2<S, T>(T t)
{
return typeof(T) == typeof(S);
}
static bool Is<S, T>(T t)
{
return t is S;
}
আমি কাস্টম ধরণের জন্যও চেষ্টা করেছি এবং ফলাফলগুলি সুসংগত ছিল:
var c1 = new Class1();
var c2 = new Class2();
object oc1 = c1;
object oc2 = c2;
var s1 = new Struct1();
var s2 = new Struct2();
object os1 = s1;
object os2 = s2;
bool b = false;
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
{
b = c1.GetType() == typeof(Class1); // ~60ms
b = c1 is Class1; // ~60ms
b = c2.GetType() == typeof(Class1); // ~60ms
b = c2 is Class1; // ~55ms
b = oc1.GetType() == typeof(Class1); // ~60ms
b = oc1 is Class1; // ~68ms
b = oc2.GetType() == typeof(Class1); // ~60ms
b = oc2 is Class1; // ~68ms
b = s1.GetType() == typeof(Struct1); // ~150ms
b = s1 is Struct1; // ~50ms
b = s2.GetType() == typeof(Struct1); // ~150ms
b = s2 is Struct1; // ~50ms
b = os1.GetType() == typeof(Struct1); // ~60ms
b = os1 is Struct1; // ~64ms
b = os2.GetType() == typeof(Struct1); // ~60ms
b = os2 is Struct1; // ~64ms
b = GetType1<Class1, Class1>(c1); // ~178ms
b = GetType2<Class1, Class1>(c1); // ~98ms
b = Is<Class1, Class1>(c1); // ~78ms
b = GetType1<Class1, Class2>(c2); // ~178ms
b = GetType2<Class1, Class2>(c2); // ~96ms
b = Is<Class1, Class2>(c2); // ~69ms
b = GetType1<Class1, object>(oc1); // ~178ms
b = Is<Class1, object>(oc1); // ~69ms
b = GetType1<Class1, object>(oc2); // ~178ms
b = Is<Class1, object>(oc2); // ~69ms
b = GetType1<Struct1, Struct1>(s1); // ~272ms
b = GetType2<Struct1, Struct1>(s1); // ~140ms
b = Is<Struct1, Struct1>(s1); // ~163ms
b = GetType1<Struct1, Struct2>(s2); // ~272ms
b = GetType2<Struct1, Struct2>(s2); // ~140ms
b = Is<Struct1, Struct2>(s2); // ~163ms
b = GetType1<Struct1, object>(os1); // ~178ms
b = Is<Struct1, object>(os1); // ~64ms
b = GetType1<Struct1, object>(os2); // ~178ms
b = Is<Struct1, object>(os2); // ~64ms
}
sw.Stop();
MessageBox.Show(sw.Elapsed.TotalMilliseconds.ToString());
এবং প্রকারগুলি:
sealed class Class1 { }
sealed class Class2 { }
struct Struct1 { }
struct Struct2 { }
অনুমান:
এস এ কল GetType
করা struct
ধীর। ক্লাসে GetType
সংজ্ঞায়িত করা হয় object
যা সাব টাইপগুলিতে ওভাররাইড করা যায় না এবং এইভাবে struct
ডাকার জন্য বক্স করা দরকার GetType
।
একটি বস্তুর উদাহরণস্বরূপ, GetType
দ্রুত, কিন্তু খুব প্রান্তিক।
জেনেরিক ধরণে, যদি T
হয় class
তবে is
তা আরও দ্রুত। যদি T
হয় struct
, তাহলে is
অনেক দ্রুত চেয়ে GetType
কিন্তু typeof(T)
অনেক দ্রুত উভয় চেয়ে। ক্ষেত্রে T
হচ্ছে class
, typeof(T)
প্রকৃত অন্তর্নিহিত ধরণ থেকে তার বিভিন্ন যেহেতু নির্ভরযোগ্য নয় t.GetType
।
সংক্ষেপে, আপনার যদি একটি object
উদাহরণ থাকে, ব্যবহার করুন GetType
। আপনার যদি জেনেরিক class
টাইপ থাকে তবে ব্যবহার করুন is
। আপনার যদি জেনেরিক struct
টাইপ থাকে তবে ব্যবহার করুন typeof(T)
। আপনি যদি নিশ্চিত না হন যে জেনেরিক প্রকারটি রেফারেন্স টাইপ বা মান প্রকারের হয় তবে ব্যবহার করুন is
। আপনি যদি সর্বদা একটি শৈলীর সাথে সামঞ্জস্য রাখতে চান (সিল করা ধরণের জন্য), ব্যবহার করুন is
..