12
Ara'13

OOP 6: Static Kavramı ve Static Elemanlar (C# ile OOP)

Static, adından da anlaşılabileceği gibi “durağan” olmakla alakalıdır. Örneğin static bir değişken belleğe sadece bir defa çıkarılır ve durağandır. Erişmek isteyen herkes aynı adresten okuma yapar. Fakat değerlerini değiştirmek mümkündür. Sabitlerle karıştırılmamalıdır. Sabitlere tanımlandıkları anda bir kereye mahsus değerleri atanır ve değiştirilemez fakat static elemanların değerleri istenildiğinde değiştirilebilir. Daha iyi kavramak için, static elemanların ne tip ihtiyaçlarda kullanılabileceğini inceleyelim.

Static Field ve Static Property

Mesela bir sınıftan kaç adet nesne örneklendiğini bilmek istiyoruz. Belki de bir oto galerimiz var ve adını tek yerde tutmak, her nesne için aynı ada ulaşmak istiyor olabiliriz. Bunlar ve bunlar gibi ihtiyaçlar için static elemanlara başvurmak gerekiyor. Bir elemanı static olarak işaretlemek için static anahtar kelimesini kullanmak yeterlidir.

class OtoGaleri
{
    private static string _firmaAdi;
}

Bu eleman static olmasaydı, otoGaleri sınıfından bir nesne örneklendiğinde _firmaAdi default değeri ile belleğe çıkacaktı. Bir nesne daha örnekendiğinde yine yeni bir _firmaAdi belleğe default değeriyle çıkacaktı. Kısacası ne kadar nesne örneklenirse o kadar da _firmaAdi belleğe çıkacaktır. Fakat _firmaAdi için static anahtar kelimesi kullanıldığında, OtoGaleri sınıfından ne kadar nesne örneklenirse örneklensin bellekte tek bir _firmaAdi elemanı varlığını sürdürecektir. Hal böyle olunca bu elemana nesne örneği üzerinden erişmek, kodu yazanda veya okuyanda yanılgıya sebep olabilir. Aslında static olan bu elemanın sadece bir nesne için değiştiğini düşündürtebilir. Öyleyse mantıklı olan, static elemana tip adı üzerinden erişmek olabilir. C#’ta da static elemanlara erişim tip adı üzerinden yapılmaktadır.

 

Static elemana yalnızca tip adı üzerinden erişilebildiğini gösteren ekran alıntılarını aşağıdan inceleyebilirsiniz.

İlgili sınıf aşağıdaki şekilde kodlanmıştır. Bir static field ve bu fielda erişim sağlayan bir propertyden oluşmaktadır.

internal class OtoGaleri
{
    private static string _firmaAdi;

    public static string FirmaAdi
    {
        get { return _firmaAdi; }
        set { _firmaAdi = value; }
    }
}

Static Ise Tip Adından Erişilir

Ekran alıntılarında da görüldüğü gibi otoGaleri nesne örneği ile static olan FirmaAdi propertysine erişilemezken, OtoGaleri tip adı üzerinden erişilebilmektedir. Tüm static elemanlar için durum böyledir. Ayrıca static elemanlar için “this” anahtar kelimesi kullanılamaz.

 

Görüldüğü gibi field ve propertyler static tanımlanabiliyor. Metotlar ve hatta yapıcı metotlar ve sınıflar da static olarak tanımlanabilir. İlk önce static metotları ve sınıfları inceleyelim.

Static Metot ve Static Sınıf

Static metotlara da tüm static elemanlar gibi tip adı kullanılarak erişilir. Metodu static yapmak için yine tek gereken static anahtar kelimesidir. Bir dört işlem sınıfımızın olduğunu düşünelim ve içine işlemleri kodlayalım.

class DortIslem
{
    public static int Topla(int x, int y)
    {
        return x + y;
    }

    public static int Cikar(int x, int y)
    {
        return x - y;
    }

    public static int Carp(int x, int y)
    {
        return x * y;
    }

    public static int Bol(int x, int y)
    {
        return x / y;
    }
}

Sınıfı yukarıdaki şekilde kodlayarak nesne örneklemeden kullanılmaya oldukça musait olan bu metotları nesne örneklemeden kullanabiliyoruz. Bu sınıf sadece static elemanlara sahip ve aslında bu sınıftan nesne türetilmesinin bir anlamı yok. Öyleyse bunu engelleyebileceğimiz bir yöntem olmalı. O yöntem de sınıfı static yapmaktır. Böylece bu sınıftan nesne örneklenmesini engelleriz. Bir sınıf static yapıldığında içerisine static olmayan herhangi bir eleman kodlanamaz. 

static class DortIslem
{
    public static int Topla(int x, int y)
    {
        return x + y;
    }

    ...

}

Static Constructor

Static ctor genellikle static elemanlara ilk değer atamalarını bir defaya mahsus yapmak için kullanılır. İlk defa ilgili sınıftan nesne yaratıldığında bir defaya mahsus çalışmaktadır. Static ve static olmayan yapıcı fonksiyonun kullanımında oluşacak farka ufak bir örnek:

 

Bir sınıf ve içerisine bir public static  field ile bu fieldı set edecek public bir metot kodlayalım. Constructor da bu static fielda ilk değerini versin. İlk önce, ctor public olsun ve iki nesne yaratıp propertynin aldığı değerleri izleyelim.

class Tasit
{
    public static string Marka = "Wolkswagen";

    public Tasit()
    {
        Marka = "Skoda";
    }

    public void MarkaDegistir(string marka)
    {
        Marka = marka;
    }
}

Aşağıdaki şekilde 2 adet nesne yaratıp fieldın aldığı değerleri inceleyelim.

Tasit t = new Tasit();
Console.WriteLine(Tasit.Marka);

t.MarkaDegistir("Audi");
Console.WriteLine(Tasit.Marka);

Tasit t2 = new Tasit();
Console.WriteLine(Tasit.Marka);

PublicCtorIleStaticField

Görüldüğü gibi her nesne yaratıldığında ctor çağırıldı ve static elemanı ikinci nesneyi örneklemeden önce değiştirmemize rağmen “skoda” değerini tekrar aldı.

 

Şimdi ise ctor’u static yapalım ve sonucu tekrar inceleyelim. Ayrıca static ctorlar parametre alamaz, erişim belirleyiciler ile işaretlenemez ve içlerinde static olmayan elemanlar kullanılamaz.

class Tasit
{
    ...

    static Tasit()
    {
        Marka = "Skoda";
    }

    ...

}

StaticCtorIleStaticField

Görüldüğü gibi ctor static olduğunda ikinci defa çağırılmadı ve ikinci nesne örneklenmesinde elemanın değerini değiştirerek tekrar “Skoda” yapmadı.

 

Nesne tanımlandığı anda, herhangi bir dış kaynaktan(config dosyası, veritabanı vs.) static bir propertye bir değer atanmak istendiğinde, static constructor oldukça anlam kazanıyor. Bir de bu static propertynin sonradan değişmesi istenmezse setter’ı kodlanmayabilir.

 

Ayrıca bakınız: Singleton Design Pattern

 

Özet

– Static elemanlar belleğe bir defa çıkarlar ve erişmek isteyen her nesne aynı adrese erişir.

– Static elemanlar sabitlerle karıştırılmamalıdır. Değerlerini değiştirmek mümkündür.

– Static elemanlara tip adı üzerinden erişilir.

– Static elemanlar için this anahtar kelimesi kullanılamaz.

– Bir sınıf static yapıldığında içerisine static olmayan herhangi bir eleman kodlanamaz.

– Static ctor, ilk nesne tanımlandığında bir defa çağırılır ve bir daha çağırılmaz. Parametre almaz ve içerisinde static olmayan elemanlarla ilgili işlem yapılamaz. Erişim belirleyiciler ile işaretlenemez.

 

İyi Eğlenceler:)

  • Ceyhun

    Cok guzel bir anlatim. Faydali )

Yeni makaleleri E-Mail ile takip edin!