Hiçbirinin doğrudan değinmediği önemli ve ince bir konu var. C # dilinde yazıyı göz önünde bulundurmanın iki yolu vardır: statik tip ve çalışma zamanı tipi .
Statik tür , kaynak kodunuzdaki bir değişkenin türüdür. Bu nedenle bir derleme zamanı kavramıdır. Bu, geliştirme ortamınızdaki bir değişkenin veya özelliğin üzerine geldiğinizde bir araç ipucunda gördüğünüz türdür.
Yazım çıkarımının sizin için onu halletmesine izin vermek için yardımcı genel yöntem yazarak statik türü elde edebilirsiniz:
Type GetStaticType<T>(T x) { return typeof(T); }
Çalışma zamanı türü , bellekteki bir nesnenin türüdür. Bu nedenle bir çalışma zamanı kavramıdır. Bu GetType()yöntem tarafından döndürülen türdür .
Bir nesnenin çalışma zamanı türü, onu tutan veya döndüren değişken, özellik veya yöntemin statik türünden sıklıkla farklıdır. Örneğin, aşağıdaki gibi bir koda sahip olabilirsiniz:
object o = "Some string";
Değişkenin statik türü object, ancak çalışma zamanında değişkenin referansının türü string. Bu nedenle, sonraki satır konsola "System.String" yazdıracaktır:
Console.WriteLine(o.GetType());
Ancak, ogeliştirme ortamınızda değişkenin üzerine gelirseniz, türü System.Object(veya eşdeğer objectanahtar kelimeyi) görürsünüz . Yukarıdan yardımcı işlevimizi kullanarak da aynısını görüyorsunuz:
Console.WriteLine(GetStaticType(o));
Gibi değer-tipi değişkenler için int, double, System.Guid, sen değer türleri başka türü için temel sınıf olarak hizmet edemez, çünkü çalışma zamanı türü her zaman statik türü olarak aynı olacağını biliyoruz; değer türünün, miras zincirinde en çok türetilmiş tür olduğu garanti edilir. Bu aynı zamanda mühürlü referans türleri için de geçerlidir: Statik tip mühürlü bir referans tipiyse, çalışma zamanı değeri ya bu tipin bir örneği veya null.
Tersine, değişkenin statik türü soyut bir türse, statik türün ve çalışma zamanı türünün farklı olacağı garanti edilir.
Bunu kodla göstermek için:
int i = 0;
Console.WriteLine(i.GetType() == typeof(int));
string s = "Foo";
Console.WriteLine(s == null || s.GetType() == typeof(string));
object o = new FileInfo("C:\\f.txt");
Console.WriteLine(o == null || o.GetType() == typeof(object));
FileSystemInfo fsi = new DirectoryInfo("C:\\");
Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo));
int