एक महत्वपूर्ण और सूक्ष्म मुद्दा है जो उनमें से कोई भी सीधे संबोधित करता है। C # में टाइप करने के दो तरीके हैं: स्टैटिक टाइप और रन-टाइम टाइप ।
स्थैतिक प्रकार आपके स्रोत कोड में एक चर का है। इसलिए यह एक संकलन-समय की अवधारणा है। यह वह प्रकार है जिसे आप टूलटिप में देखते हैं जब आप अपने विकास के वातावरण में एक चर या संपत्ति पर मंडराते हैं।
आप टाइप करने के लिए स्थैतिक प्रकार लिखकर हेल्पर जेनेरिक विधि प्राप्त कर सकते हैं।
Type GetStaticType<T>(T x) { return typeof(T); }
रन-टाइम प्रकार मेमोरी में ऑब्जेक्ट का प्रकार है। इसलिए यह एक रन-टाइम अवधारणा है। यह GetType()विधि द्वारा लौटाया गया प्रकार है ।
किसी ऑब्जेक्ट का रन-टाइम प्रकार स्थिर वैरिएबल, प्रॉपर्टी, या विधि के अलग-अलग प्रकार से होता है जो इसे धारण या रिटर्न करता है। उदाहरण के लिए, आपके पास इस तरह का कोड हो सकता है:
object o = "Some string";
वैरिएबल का स्थिर प्रकार है object, लेकिन रन टाइम पर, वेरिएबल के रेफरेंस का प्रकार है string। इसलिए, अगली पंक्ति कंसोल में "System.String" प्रिंट करेगी:
Console.WriteLine(o.GetType()); // prints System.String
लेकिन, यदि आप oअपने विकास के वातावरण में चर पर होवर करते हैं, तो आपको टाइप System.Object(या समतुल्य objectकीवर्ड) दिखाई देगा। आप भी ऊपर से हमारे सहायक समारोह का उपयोग करते हुए देखें:
Console.WriteLine(GetStaticType(o)); // prints System.Object
जैसे मूल्य-प्रकार चर, के लिए int, double, System.Guid, आप जानते हैं कि रन-टाइम प्रकार हमेशा की तरह, स्थिर प्रकार के रूप में ही होगा, क्योंकि मूल्य प्रकार एक अन्य प्रकार के लिए आधार वर्ग के रूप में काम नहीं कर सकते हैं; मूल्य प्रकार इसकी विरासत श्रृंखला में सबसे व्युत्पन्न प्रकार होने की गारंटी है। यह सीलबंद संदर्भ प्रकारों के लिए भी सही है: यदि स्थैतिक प्रकार एक सील संदर्भ प्रकार है, तो रन-टाइम मान या तो उस प्रकार का उदाहरण होना चाहिए या null।
इसके विपरीत, यदि वैरिएबल का स्थिर प्रकार एक अमूर्त प्रकार है, तो यह गारंटी है कि स्थिर प्रकार और रनटाइम प्रकार अलग-अलग होगा।
यह बताने के लिए कि कोड में:
// int is a value type
int i = 0;
// Prints True for any value of i
Console.WriteLine(i.GetType() == typeof(int));
// string is a sealed reference type
string s = "Foo";
// Prints True for any value of s
Console.WriteLine(s == null || s.GetType() == typeof(string));
// object is an unsealed reference type
object o = new FileInfo("C:\\f.txt");
// Prints False, but could be true for some values of o
Console.WriteLine(o == null || o.GetType() == typeof(object));
// FileSystemInfo is an abstract type
FileSystemInfo fsi = new DirectoryInfo("C:\\");
// Prints False for all non-null values of fsi
Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo));
int