Static değişkenlerin ilk değerlerini ayarlama

static tanımlı değişkenleri kullanırken dikkat etmemiz gereken bir husus var

Sınıf içerisinde kullandığımız değişkenleri aynı bir property gibi ya da bir method gibi public, private ve static olarak tanımlayabiliyoruz. (değişkenleri public tanımlamak racona ters biliyorum ama hatalı bir işlem de değildir)

Bir class içerisinde static tanımlı bir değişken tanımladığınız zaman, hem sınıf içinde hem de sınıf dışında sınıf örneğine ihtiyaç (instance / object / nesne) duymadan erişim mümkün.

class BenimClass
{
   public static A = 10;
}

// ....
// herhangi bir yerden
// erişim için:
BenimClass.A = 20;

Birden fazla static değişken kullanmak istediğimizde ise dikkat etmemiz gereken bir konu var. Aşağıdaki class ı inceleyiniz:

class ToplamaIslemi
{
 internal static int Toplam = A + B;
 internal static int A = 5;
 internal static int B= 2; 
}

void Main()
{
 Console.WriteLine("A:   {0}", ToplamaIslemi.A);
 Console.WriteLine("B:   {0}", ToplamaIslemi.B);
 Console.WriteLine("Toplam: {0}", ToplamaIslemi.Toplam);
}

Çıktı olarak ne beklediğinizi biliyorum. A:5, B:2, Toplam:7 olacak diyorsunuz.

Ama aslında çıktımız şu şekilde oluyor:

A:   5
B:   2
Toplam: 0

Dikkat edin, sınıf içerisinde önce toplama sonra değer atamalar gerçekleştiriliyor.

Peki bu durumun önüne nasıl geçebiliriz:

Çözüm 1)

Önce değer atamaları, sonra toplama işlemini gerçekleştiririz:

class ToplamaIslemi
{
 internal static int A = 5;
 internal static int B = 2; 
 internal static int Toplam = A + B;
}

Çözüm 2)

Daha güzel ve daha uygun bir çözüm olarak static constructor kullanırız:

class ToplamaIslemi
{
 internal static int A;
 internal static int B; 
 internal static int Toplam;
 
 static ToplamaIslemi()
 {
  A = 5;
  B = 2;
  Toplam = A + B;
 }
}

void Main()
{
 Console.WriteLine("A:   {0}", ToplamaIslemi.A);
 Console.WriteLine("B:   {0}", ToplamaIslemi.B);
 Console.WriteLine("Toplam: {0}", ToplamaIslemi.Toplam);
}

Yazdığınız sınıflarda Constructor ları şu ana kadar public olarak tanımlamış olabilirsiniz.

Ama gördüğünüz gibi constructor ımızı da diğer sınıf elemanları gibi static tanımlayabiliyoruz.

Bu arada constructor ı kısaca hatırlayalım:

Bir sınıftan bir nesne türettiğimiz zaman otomatik olarak çağrılan metodlardır.

  • Constructor ın adı sınıfa verdiğimiz ad ile aynıdır.
  • Herhangi bir değer döndürmezler. (void olarak da tanımlayamayız)
  • Dışarıdan çağıramayız, nesne oluştururken otomatik çağrılırlar.
  • Parametreli veya parametresiz olabilirler.
  • Overload edilebilirler.
  • Constructorlar kendi aralarında etkileşimli olabilir.

Bu yazdıklarımı toplu olarak kullanalım:

class Ogrenci
{
 public int Numara { get; set; }
 public string AdSoyad { get; set; }

 public Ogrenci()
 {
  Console.WriteLine ("Default constructor dayız");
  Numara = 10;
  AdSoyad = "ABC XYZ";
 }
 
 public Ogrenci(int numara)
 :this()
 {
  Console.WriteLine ("Parametreli constructor dayız");
  AdSoyad = "klm vyz";
 }
}

void Main()
{
 Ogrenci ogr = new Ogrenci(90);
 Console.WriteLine(ogr.AdSoyad);
}

Çıktı:

Default constructor dayız
Parametreli constructor dayız
klm vyz