Bir sınıf içerisindeki static olmayan metotlara ve özelliklere o sınıftan oluşturduğumuz nesneler üzerinden erişiriz. Static olan metotlara ve özelliklere ise nesne oluşturmadan sınıf adı ile erişiriz.
class Ogrenci
{
public static int OgrenciSayisi = 0;
public string AdiSoyadi;
public int Numara;
public Ogrenci()
{
OgrenciSayisi++;
}
}
class Program
{
static void Main(string[] args)
{
// Static elemanlara sınıf adı ile erişilir.
// Öğrenci Sayısı:0
Console.WriteLine("Öğrenci Sayısı:{0}",Ogrenci.OgrenciSayisi);
// Static olmayan elemanlara nesne oluşturularak erişilir.
Ogrenci ogr1 = new Ogrenci();
ogr1.AdiSoyadi = "Serdar Yılmaz";
ogr1.Numara = 134;
Ogrenci ogr2 = new Ogrenci();
ogr2.AdiSoyadi = "Cansu Sefil";
ogr2.Numara = 155;
// Öğrenci Sayısı:2
Console.WriteLine("Öğrenci Sayısı:{0}", Ogrenci.OgrenciSayisi);
}
}
Static olmayan elemanlar nesneye özgü bilgileri tutarken static olan elemanlar uygulama çalıştığı sürece kendilerine en son atanan değeri tutarlar. AdiSoyadi ve Numara değişkenleri static olmadığı için Ogrenci sınıfından oluşturulan her bir nesne için farklı değerler tutabilirler. OgrenciSayisi değişkeni ise static olduğu için kendisine en son atanan değeri tutacaktır.
Bir özelliği veya metodu static yapmak için erişim belirleyicisinden sonra “static” anahtar kelimesini getirmemiz gerekir.
[Erişim Belirleyicisi] static [Veri Tipi] [Özellik Adı];
public static int TamSayi;
[Erişim Belirleyicisi] static [Geri Dönüş Değerinin Tipi] [Metot Adı] (Parametreler){}
public static void Bilgi(){}
Static bir metodun içerisinden static olmayan metotlar ve değişkenler çağrılamaz. Sadece diğer static metotlar ve değişkenler çağrılabilir.
DOGRU
public static void metot1() { /*Gövde*/ }
public static void metot2() { metot1(); }
YANLIS
public void metot1() { /*Gövde*/ }
public static void metot2() { metot1(); }
Static Yapıcı Metotlar
Yapıcı metotları da normal metotlar gibi static olarak tanımlayabiliriz. Sınıfın static değişkenleri ile ilgili işlemler static yapıcı metodun içerisinde yapılabilir. Static yapıcı metotlar parametre almazlar ve erişim belirteçleri yoktur.
class Kullanici
{
private static int kullanicisayisi;
public static int KullaniciSayisi { get { return kullanicisayisi; } }
private string Nick;
private string EMail;
static Kullanici()
{
kullanicisayisi = 0;
}
public Kullanici(string Nick,string EMail)
{
this.Nick = Nick;
this.EMail = EMail;
kullanicisayisi++;
}
~Kullanici()
{
kullanicisayisi--;
}
}
class Program
{
static void Main(string[] args)
{
// Online Kullanıcı Sayısı:0
Console.WriteLine("Online Kullanıcı Sayısı:{0}",Kullanici.KullaniciSayisi);
Kullanici k1 = new Kullanici("Serdar Yılmaz", "iletisim@srdrylmz.com");
Kullanici k2 = new Kullanici("Cansu Sefil", "cansu@srdrylmz.com");
// Online Kullanıcı Sayısı:2
Console.WriteLine("Online Kullanıcı Sayısı:{0}",Kullanici.KullaniciSayisi);
}
}
Kullanici sınıfının iki adet yapıcı metodu bulunmaktadır. Bunlardan static olanı kullanicisayisi isimli static değişkenin başlangıç değerini atarken, static olmayanı Nick ve EMail değişkenlerinin atama işlemlerini gerçekleştirmektedir.
Kullanici sınıfından ilk nesne oluşturulduğunda hem static yapıcı metot hemde static olmayan yapıcı metot çalışacaktır(İlk static yapıcı metot çalışır). İlk nesneden sonra oluşturulacak diğer tüm nesnelerde sadece static olmayan yapıcı metot çağrılacaktır. Yani static yapıcı metot sadece ilk nesne oluşturulduğunda çalışır.
Static Sınıflar
Oluşturduğumuz sınıf içerisinde sadece static metotlar ve değişkenler bulunuyorsa sınıfı static olarak tanımlayabiliriz. Sınıfların static olarak tanımlanması bir zorunluluk değildir sadece okunabilirliği arttıran bir yaklaşımdır.
static class Matematik
{
public static double Topla(params double[] Sayilar)
{
double Toplam = 0;
for (int i = 0; i < Sayilar.Length; i++)
Toplam = Toplam + Sayilar[i];
return Toplam;
}
public static double Carp(params double[] Sayilar)
{
double Carpim = 1;
for (int i = 0; i < Sayilar.Length; i++)
Carpim = Carpim * Sayilar[i];
return Carpim;
}
}
class Program
{
static void Main(string[] args)
{
// 128 + 134 + 13 + 12 + 100 + 72 = 459
Console.WriteLine(Matematik.Topla(128, 134, 13, 12, 100, 72));
// 110 + 152 + 168 + 153 = 583
Console.WriteLine(Matematik.Topla(110, 152, 168, 153));
// 128 * 134 * 13 * 12 * 100 * 72 = 19265126400
Console.WriteLine(Matematik.Carp(128, 134, 13, 12, 100, 72));
// 110 * 152 * 168 * 153 = 429770880
Console.WriteLine(Matematik.Carp(110, 152, 168, 153));
}
}
Matematik sınıfının üye elemanları(Topla ve Carp metotları) static olduğu için sınıfı da static olarak bildirdik. Matematik sınıfının static olduğunu gören bir programcı, sınıf içerisinde sadece static elemanların bulunduğunu anlayacaktır.
Static sınıflarla alakalı bilinmesi gerekenler;
- Static sınıflardan nesne oluşturulamaz. (new Matematik(); YANLIŞ)
- Static sınıf türünden referanslar oluşturulamaz. (Matematik m; YANLIŞ)
- Static sınıfların içinde static olmayan metot yada değişken tanımlanamaz.
- Static sınıflarda kalıtım yoktur.
Serdar YILMAZ