30 Ocak 2015 Cuma

C# Keyword'leri: is - as

Merhabalar,

Bu yazımız da C# dilinde sıklıkla kullanılan iki tane anahtar kelimeleri (keyword) inceleyeceğiz.
Bildiğiniz üzere nesne yönelimli programlamanın temel prensibi her şeyi nesne olarak ele almaktır.
Nesneler ait oldukları sınıfın özelliklerini alırlar, yani sınıflar, nesnelerin temel taşıdır diyebiliriz.

C# dilini kullanarak geliştirdiğimiz herhangi bir masaüstü uygulaması veya web uygulaması veya konsol uygulamasında öyle durumlar karşımıza çıkabilir ki ele alınan nesnenin tipini orada belirsiz olabilir ve bu durumdan dolayı nesnenin özelliklerine erişemeyebiliriz. Buna benzer bir durumu nesne yönelimli programlamanın prensiplerinden biri olan kalıtım (inheritance) yapısında da görebiliriz.



is ve as keywordlerini basit bir uygulama üzerinden gösterip ardından örneklerle açıklamaya çalışacağım. Öncelikle bir C# Console Application projesi açalım ve birkaç tane sınıf oluşturalım.
Oluşturduğum sınıfları class diagram ile resimde görebilirsiniz:


Şekilde görüldüğü üzere Shape isimli abstract sınıfımız ve bu sınıftan kalıtım yolu ile türetilmiş
Rectangle ve Circle isimli sınıflarımız olsun. Bir de bu sınıflardan bağımsız bir Product sınıfımız olsun.

Öncelikle is anahtar kelimesinin kullanımına bakalım.
Bir nesnenin herhangi bir sınıfa ait olup olmadığını kontrol eder. Bu kontrolleri yaptığımız takdirde kodlarımız daha güvenilir olucaktır. Örneğimizde Product sınıfından bir nesne oluşturduk ve bu nesnenin Rectangle ve Product sınıflarına ait olup olmadıklarını kontrol ettik. Tahmin edeceğiniz üzere kodumuzun çıktısı "p bir Product'dır" olucaktır.

    /// is kullanımı
    /// <Nesne> is <Sınıf ismi> şeklinde kullanılır
    /// bool değer döndürür
    var p = new Product();
    if (p is Rectangle)
    {
        Console.WriteLine(" p bir Rectangle'dır ");
    }
    else if (p is Product)
    {
        Console.WriteLine(" p bir Product'dır ");
    }

Bir diğer örneğimizde de Shape tipinden bir Rectangle oluşturduk ve is anahtar kelimesi ile sınıf kontrolü yaptık.

    /// is kullanımı - inheritance
    /// bir sınıftan türetilmiş bir sınıfın nesnesi
    /// her iki sınıfa da ait olabilir
    Shape r1 = new Rectangle();
    if (r1 is Rectangle)
    {
        Console.WriteLine("r1 Rectangle'dır ");
    }
    if (r1 is Shape)
    {
        Console.WriteLine("r1 Shape'dir ");
    }

Bu kodumuzun çıktısı ise resimdeki gibidir.














as anahtar kelimesi ise bir nesneyi eğer mümkünse bir sınıfa cast edilmesini sağlar.
Aşağıdaki örnekte Rectangle r = r1 as Rectangle; kodu ile r1 nesnesi Rectangle olarak alınmıştır.

    /// as kullanımı
    /// <Nesne> as <Sınıf ismi> şeklinde kullanılır
    /// belirtilen nesneyi eğer mümkünse belirtilen sınıfa cast edilir
    Shape r1 = new Rectangle();
    Rectangle r = r1 as Rectangle;
    r.X = 5;

    /// diğer bir kullanım
    (r1 as Rectangle).X = 5;

Eğer cast ettiğimiz nesne o sınıfa ait değil ise programımız hata vermez ancak as kelimesi geriye null değer döndürür.

    var rc = new Rectangle();
    yanlisKullanim(rc);

    static void yanlisKullanim(Shape s)
    {
        Circle p = s as Circle;
        if (p == null)
            Console.WriteLine("p bir Circle degildir!");
    }


Aşağıdaki örnekleri inceleyelim:

Main metodunda Shape tipinden bir Rectangle oluşturalım ve methodA isimli methoda gönderelim. Dikkat ederseniz metodun parametresinde Shape tipinden bir nesne aldık. Bu metotta aldığımız parametrenin Rectangle mı yoksa Circle mı olduğunu tam olarak kestiremiyoruz. İşte burada is ve as keywordlerini kullanmamız gerekir.

static void methodA(Shape s)
{
       if(s is Rectangle){
            Rectangle r = s as Rectangle;
            r.X = 5;
            r.Y = 5;
       }
       else if(s is Circle){
            Circle c = s as Circle;
            c.radius = 6;
       }
 }

static void Main(string[] args)
{
            Shape s = new Rectangle();
            methodA(s);
}


Örnek olarak bir başka durumu daha inceleyelim:

Bir windows forms uygulamasında bir tane button kontrolünün click olayına baktığımızda sender isimli object tipinden bir argüman olduğunu görürüz:

private void button1_Click(object sender, EventArgs e)
{
       Button btn = sender as Button;
       btn.Text = "Tıklandı";
}

İlgili buton tıklandığı zaman bu metod tetiklenir ve tıklanılan buton object olarak gönderilir. (C# ta her sınıf object sınıfından türetilmiştir.) Bu metodun içinde sender isimli nesneyi kullanarak o butonun özelliklerini değiştirmek istediğimizde as keyword'ünü kullanmamız gerekir.

Böylece bir makalemizin daha sonuna geldik, faydalı olması dileğiyle.
Görüşmek üzere.

Kemal DURAN

Hiç yorum yok:

Yorum Gönder