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:
- Runtime Type Identification - RTTI (Çalışma Zamanı Tip Tanımlaması)
- Reflection (Yansıma)
- 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.
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.
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.
as operatörü aslında yukarıdaki deyimi gerçekler. Yukardaki kod bloğu aşağıdakiyle değiştirilebilir.
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...
0 yorum:
Yorum Gönder