C#'ta static Kavramı

Eyl 06, 2013
İçinde buluduğu sınıftan nesne oluşturulmadan veya hiç bir nesneye referans olmadan kullanılabilen üyeler static olarak nitelendirilir. Metotlar ve alanlar staticolarak tanımlanabilir.

Bir Sınıf İçerisinde Bulunan Metotların Static Olarak Tanımlanması

static olma durumunun en bilinen örneği Main() metodudur. Main(), herhangi bir nesne oluşturulmadan önce çağırılması gerektiği için static olarak tanımlanmıştır. Başka bir deyişle de bir nesne metodun üreteceği sonucu etkilemeyecek ise o metot static olarak tanımlanır. Static olarak tanımlanan bir metoda program çalıştığı sürece erişilir, böylece sadece bir metot ile birden çok nesne çağırılır. 

class Matematik
{

   public static int Toplam(int x, int y)
   {
       int z = x + y;
       return z;
   }

}

class Program
{
   static void Main(string[] args)
   {
      int sonuc = Matematik.Toplam(3, 5);
      Console.WriteLine(sonuc);
   }
}

Yukarıdaki örnekte "Matematik" sınıfı altında "Toplam()" isimli static metodu oluşturuldu ve program sınıfının static Main() metoduna verilebilecek her tamsayı x ve y değerleri için toplama işlemi gerçekleşir. Böylece static olarak tanımlanmış sınıf metotlarına static olmayan sınıf üyelerininde erişebileceği görülür. Aşağıdaki örnekte ise static olmayarak tanımlanın bir metodun static "Toplam()" metoduna ulaşabildiği görülür.

public int Toplamlar(int x, int y, int m)
{

   int sonuc = 0;
   for (int i = 0; i <m; i++)

       sonuc += Toplam(x, y);
       return sonuc;
}


static bir metot olan "Toplam()" metodundan  static olmayan Toplamlar metoduna erişilmek istenirse  "An object reference is required for the nonstatic field, method, or property StaticKavrami.Matematik.Toplamlar(int, int, int)" hatası ile karşılaşılır. 

Bir Sınıf İçerisinde Bulunan Alanların Static Olarak Tanımlanması:

Bir sınıf içerisinde bulunan alanlarda static olarak tanımlanabilir. Eğerstatic kavramı yok ise sınıftan nesne oluşturulması gerekir. Bir değişken static ise sınıfın tamamıyla ilgilidir ve buna "sınıf alanı" adı verilir; static değil ise bir nesneyle ilgilidir, buna da "nesne alanı" adı verilir. Sınıf alanları, nesneye değil sınıfa ait bilgiler içerir. Ayrıca, sınıf alanlarından oluşturulan her nesne için bellekte bir tane sınıf alanı vardır ve her şekilde ona erişilir.

Aşağıdaki örnekte "Matematik" sınıfına ait y ve z nesne örnekleri oluşturulmuştur ancak bunların değerleri static olan x değerine eşittir. x değişkenine de metotta olduğu gibi 
SınıfAdı.DeğişkenAdı şeklinde ulaşıldığı görülür.

static alanların bir diğer özelliği ise çalışma zamanında değerlerinin değiştirilebiliyor olmasıdır. Bunun için aşağıdaki örnek uygulamada "xDeğistir()" adındaki metot kullanılmştır.

class Matematik 

   public static double x=5.5;

   public void xDegistir(int y)
      {
        x = y;
      }
}

class Program
{
   static void Main(string[] args)
      {
         Matematik y = new Matematik();
         Console.WriteLine(Matematik.x);

         Matematik z = new Matematik();
         Console.WriteLine(Matematik.x);

         z.xDegistir(4);
     
         Matematik t = new Matematik();
         Console.WriteLine(Matematik.x);
             }
}

Bu örneğin çıktısında  y ve z isimli nesnelerinin 5.5 değerini aldıklarını, z değeri üzerinden "xDegistir()" metodu çağırıldıktan sonra, oluşturulan t  isimli nesne örneğinin static x değişkeninin yeni değeri olan 4 ü aldığı görülür. Yeni bir metot çağrısı ile static x değişkeninin değeri değiştirilene kadar oluşturulan her nesne örneği 4 değerini alır.