18 Ocak 2018 Perşembe

C# Runtime Type Identification - RTTI - Yazı Serisi - 1


Merhaba,

Bu yazı serisinde C#'ın, dinamik yapılar inşa etmede çok güçlü 3 konusundan bahsedeceğim. Bu 3 konu birbiriyle bağlantılı olduğu için yazı serisine bağlamak mantıklı olur diye düşündüm. Konular sırasıyla aşağıdaki gibidir:

  1. Runtime Type Identification - RTTI (Çalışma Zamanı Tip Tanımlaması)
  2. Reflection (Yansıma)
  3. Attributes (Nitelikler)
Bu 3 kavram da çalışma zamanında (runtime) nesne yapılandırmayla ilgilidir. Basit bir programda runtime sırasında tip tanımlamaya pek ihtiyaç duyulmaz fakat programlar büyüdükçe kontrol edilmesi güç bir hal almaktadır. Programlarınız büyüdükçe göreceksiniz ki dinamik yapılara ihtiyaç duyacaksınız. Bir program ne kadar esnek, ne kadar dinamik olursa o kadar güçlüdür, o kadar değerlidir.

Lafı çok uzatmadan birinci maddeden başlayalım. (Bu yazıda sadece birinci maddeden bahsedeceğim. Diğer konular için başlıkların üzerindeki linklere tıklayabilirsiniz). Çalışma zamanı tip tanımlaması (Runtime Type Identification - RTTI), adından da anlaşılacağı üzere bir programın çalışması sırasında bir tipin tanınmasına imkan verir. Bunun ne gibi faydaları var derseniz, bir temel sınıfın ne tür bir nesneye referans verdiğini belirlemek ya da tip atamalarının geçersiz olup olmadığını anlamaktır. RTTI aynı zamanda Reflection ile de ilgilidir. RTTI'nın 3 önemli anahtar sözcüğü vardır: is, as ve typeof. Bunları biraz daha açalım.


is anahtar sözcüğü


Bir nesnenin bir tipte olup olmadığını kontrol eder. Eğer tip uyumu varsa true yoksa false döner.

Aşağıdaki örneği inceleyelim:

using System; class A { } class B : A { } class Program { static void Main(string[] args) { A a = new A(); B b = new B(); if (a is A) Console.WriteLine("a nesnesi A tipi ile uyumludur"); if (b is A) Console.WriteLine("b nesnesi A tipi ile uyumludur"); if (a is B) Console.WriteLine("a nesnesi B tipi ile uyumludur"); else Console.WriteLine("a nesnesi B tipi ile uyumlu değildir"); if (a is object) Console.WriteLine("a bir objedir"); Console.ReadLine(); } }

Bu kodun çıktısı aşağıdaki gibi olacaktır:

a nesnesi A tipi ile uyumludur
b nesnesi A tipi ile uyumludur
a nesnesi B tipi ile uyumlu değildir
a bir objedir


Görüldüğü üzere, is operatörü bir tip atamasının geçerli olup olmadığını tespit etmek için kullanılır. is'in genel kullanım şekli bu şekildedir.


as anahtar sözcüğü


Bazen bir tip atamasının başarısız olması durumunda exception fırlatmamasını istersiniz. Bu durumda as anahtar sözcüğü kullanılabilir. Eğer tip ataması başarılı olursa true döndürür, başarısız olursa exception fırlatmak yerine null değeri döndürülür. 

as operatörü aslında is operatörünün özelleşmiş halidir. as operatörüne örnek vermeden önce yukardaki örnek için aşağıdaki kodu inceleyelim.

if (a is B) b = (B)a; else b = null;

as operatörü aslında yukarıdaki deyimi gerçekler. Yukardaki kod bloğu aşağıdakiyle değiştirilebilir.


b = a as B;//burada tip uyumsuzluğu var. dolayısıyla a nesnesi B tipine dönüşmeyecek ve //null dönecektir. if (b == null) { Console.WriteLine("Atama gerçekleşmedi!"); }

typeof Kullanımı


as ve is operatörleri kendilerine göre kullanışlı olmalarına rağmen, sadece tip uyumluluğunu kontrol ederler. typeof ise bir tip için System.Type nesnesi yükler. Bundan sonra bu tip hakkında Type tarafından tanımlanan çeşitli özellik ve metotları kullanarak bu tip hakkında bilgi elde edilebilir. Reflection kısmında bunun önemi daha da anlaşılacaktır. Reflection kısmında daha detaylı incelenecektir ama kısaca bilgi vermek gerekirse; Type üç önemli özelliği kullanabilir: FullName, IsClass, IsAbstract. Bunlara kısaca bir göz atalım:

using System; using System.IO; class TypeOfKullanimi { static void Main(string[] args) { Type t = typeof(StreamReader); Console.WriteLine(t.FullName); if (t.IsClass) Console.WriteLine("t bir classtır"); if (t.IsAbstract) Console.WriteLine("t bir abstract classtır"); Console.ReadLine(); } }

Bu programın çıktısı aşağıdaki gibi olacaktır:

System.IO.StreamReader
t bir classtır


Tip dönüşümleri hakkında bu bilgileri verdikten sonra bir sonraki derste C#'ın en güçlü özelliklerinden biri olan Reflection'a göz atacağız.

Umarım faydalı olabilmişimdir...


Paylaş:

0 yorum:

Yorum Gönder

Bu Blogda Ara