Static Nedir?

Static anahtar sözcüğü C# programlama dilinde üstü kapalı yada açık bir biçimde pek çok yerde kullanılır. C# programlama dilini yeni öğrenen birisi için static anahtar sözcüğünün kullanım alanlarını bilmek önemlidir. İşte bu amaçla yola çıktığımız bu makalemizde, static kavramının C# programlama dilindeki yerini incelemeye çalışacağız. Static anahtar sözcüğünün aşağıdaki listede olduğu gibi çeşitli durumlarda kullanabiliriz.

1-Bir sınıf(class) içerisinde bulunan metodlar(methods) static olarak tanımlanabilir.

2-Bir sınıf(class) içerisinde bulunan alanlar (fields) static olarak tanımlanabilir.

3-Bir sınıfa ait static bir yapıcı metod (constructors) tanımlanabilir.

1 . Bir sınıf(class) içerisinde bulunan metodlar(methods) static olarak tanımlanabilir.

Static olarak tanımlanan bir metodun kullanılabilmesi için tanımlanmış olduğu tipin nesne örneğini oluşturmaya gerek yoktur. Bu durum çoğunlukla bir tipin asıl iş yapan fonksiyonelliklerin kullanılabilmesi için, tüm nesneyi örneklemenin gereksiz olduğu durumlarda ele alınır. Örneğin aşağıdaki kod parçasını ele alalım. Bu kod parçasında basit olarak Matematik isimli sınıf içerisinde tanımlanmış Toplam isimli static bir metod yer almaktadır.

    class Matematik
    {
        public static double Toplam(double x, double y)
        {
            return x + y;
        }
    }
}

Program.cs;

 class Program
    {
        static void Main(string[] args)
        {
            double result = Matematik.Toplam(4, 5);
        }
    }
}

Görüldüğü gibi intelli-sense özelliği Matematik isimli tip yazıldıktan sonra kullanılabilecek static metodumuzu doğrudan göstermektedir. .Net Framework içerisinde yukarıdaki örnekte bizim tarafımızdan tanımlanmış olan (user-defined) metod gibi yüzlerce static metod mevcuttur. Bu metodların kullanım amacı çoğunlukla tanımlanmış oldukları tipin nesne örneğine ihtiyaç duyulmayışından ileri gelmektedir. Örneğin Console uygulamalarını geliştirirken çok sık kullandığımız Console sınıfına ait WriteLine, ReadLine vb metodlar static olarak tanımlanmışlardır. Hatta bir console uygulaması geliştirdiğimizde, programın giriş noktası olan Main metodunun static olarak tanımlandığını farketmişizdir.

2. Bir sınıf içerisinde bulunan alanlar (fields) static olarak tanımlanabilir.

Static metodlar gibi, bir sınıf içerisinde kullanılabilecek static alanlarda tanımlayabiliriz. Bir alanın static olarak tanımlanması halinde bellek üzerindeki yerleşim şeklide bilinmesi gereken noktalardan bir tanesidir. Bunu daha iyi ifade edebilmek için aşağıdaki kod parçasını göz önüne alalım.

class Matematik
    {
        public static double Pi = 3.14;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Matematik mt1 = new Matematik();
            Matematik mt2 = new Matematik();
            Matematik mt3 = new Matematik();
 
            Console.WriteLine(Matematik.Pi.ToString());
            Console.WriteLine(Matematik.Pi.ToString());
            Console.WriteLine(Matematik.Pi.ToString());
        }
    }

Matematik isimli sınıfımızda static olarak yer alan Pi isimli double tipinden bir değişken yer almaktadır. Bu değişkene dikkat ederseniz static metodlardakine benzer bir şekilde SınıfAdı.DeğişkenAdı notasyonu ile erişebilmekteyiz. Ancak burada asıl önemli olan nokta Matematik sınıfına ait 3 nesne örneğinin oluşturulmasına ve kullanılmasına rağmen Pi değerinin hiç bir şekilde değişmediğidir.İşte bu etkinin nedeni Pi değerinin static olarak tanımlanmış oluşudur. Dolayısıyla Matematik nesnelerinden kaç tane oluşturulursa oluşturulsun hepsi aynı Pi değerine işaret etmektedir. Aşağıdaki grafikte bu durum sembolize edilmeye çalışılmıştır.

3 . Bir sınıfa ait static yapıcılar (constructors) tanımlanabilir.

Static yapıcı metod 2nci maddedeki son örnekte meydana gelen durum için tam bir çözüm olmaktadır. Static yapıcı metodu çoğunlukla bir sınıfın static değişkenlerine ilk nesne örneği oluşturulduğunda bir kereliğine değer atmak için kullanabiliriz. Bu bilgiler ışığında Matematik sınıfımızı aşağıdaki gibi değiştirelim ve static yapıcı metodumuz içerisinde static Pi değişkeninin değerini belirleyelim.

class Matematik
{
    public static double Pi=3.14;
 
    public void PiDegistir(double pi)
    {
        Pi = pi;
    }
    static Matematik()
    {
        Pi = 3.1415;
    }
}

Burada dikkate değer bir nokta, Pi isimli static değişken tanımlanırken 3.14 değerini almasına rağmen, Matematik sınıfına ait ilk nesne örneğinin oluşturulması ile birlikte Pi değerinin 3.1415 olarak ele alınmaya başlanmasıdır. Bunun sebebi static yapıcı metodun yaptığı değer atamasının geçerli oluşudur. Şimdi 2nci maddedeki Main metodundaki kodlarımızı Matematik sınıfının bu yeni haline göre çalıştırırsak, sistemin doğru çalıştığını ve yapıcı metodların olumsuz etkisinin gerçekleşmediğini görürüz. Buradan çıkaracağımız en iyi sonuç şudur ki bir sınıfın static üyelerinin initialize edileceği en uygun yer static yapıcı metodudur.

Static yapıcı metoda ilişkin dikkat edilmesi gereken bir takım kurallar da vardır. Bu kurallara göre;

  • Static yapıcı metod erişim belirleyicisi (access modifiers) kullanamaz.

  • Static yapıcı metod parametre alamazlar.

  • Static yapıcı metod sınıfa ait tüm yapıcılardan önce çalışır.

  • Static yapıcı metod kaç nesne örneği oluşturulursa oluşturulsun bir kere çalışır.

  • Bir sınıf sadece bir static yapıcı metod içerebilir.

  • Static yapıcı metod ya ilk nesne örneği oluşturulduğunda ya da ilk static sınıf üyesi çağırılmadan hemen önce yürütülür.

Static Sınıflar

1. Eğer nesneye bağlı işlemler geçekleştirmiyorsak yani amaç sadece belirli bir duruma hizmet eden birden fazla öğeyi barındırmak yada bir araya toplamak ise ilgili sınıfı static olarak tanımlamamız olağandır. Bu bağlamda static olarak işaretlenmiş sınıfların üyelelerine instance almadan erişebiliriz.

2. Static olarak işaretlenmiş sınıflar sadece static üyeler barındırır. !!!!!!!

3. Static sınıflara en güzel örnek File, Math, String sınıflarıdır. Aynı amaca hizmet eden matemetiksel işlemlerin bir araya getirildiği ve tutulduğu sınıftır. Yani static sınıflar ortak bir amaca hizmet eden öğerleri içerisinde barındırırlar ve bu öğelere hızlıca erişebiliriz yani instance almadan erişebiliriz. Bu durumda instance maliyetinden kurtulmuş oluruz.

4. Static sınıflar başka generic sınıflardan kalıtım almazlar kalıtım vermezler. Ama .Net Framework'ünde bütün sınıflar System.Object nesnesinden kalıtılır, static sınıflar da bu sınıflara dahildir.

5. Static sınıflar tercih etmek duruma göre değişir. Evet büyük bir esneklik sağlamaktadır. Bizi instance almaktan ve sınıflar arasında bağımlılık kurmaktan kurtarır. Fakat her sınıf static olarak işaretlenmemelidir. Çünkü tanımlanmış her static sınıf size performans ve memory kayıpları olarak yani bir başka değiş ile her zaman göz önünde bulundurmamız gereken konu maliyet olarak geri döner. Buda static olarak tanımlanmış sınıfların içerisinde barındırdırdığımız üyelerin RAM'de tutulma şekli ile ilgilidir.

Const : Sabit değer olarak tanımlamak istediğim ve değiştirilemeyecek yapılardır. Kendiliğinden static olma özelliğine sahiptir. Dolayısıyla bir daha static olarak işaretlenemler.

Last updated