Şu ana kadar hep instance construtor’lardan bahsettik. Static constructor’lara değinmeden isterseniz static keyword’üne değinelim.
Bir class yazdığımızda yadığımız kod
iki yapıya hitap edebilir. Class’a yada class’ın içerdiği objeye. Obje’ye hitap
eden metod yada değişkenleri kullanabilmek için öncelikle objenin daha öncede
değindiğimiz gibi new kewyrod’ü ile instantiate işlemine tabi tutulması
gerekmektedir. Peki yazacağımız metod obje ile ilgili değilse ne olacak. Her
seferinde new keyword’ü ile sırf o metodu kullanabilmek için bir tanımlama
yapmak zorunda kalacağız. Bu gibi durumları engellemek için static keyword’ünü
kullanırız. Static keyword ‘ü ile tanıladığımız değişkenler, metodlar direkt
olarak çağrılabiliriler. Kısacası kod class’ı ilgilendiriyorsa tanımlanan
alanlar static, obje’yi ilgilendiriyorsa tanımlanan alanlar non-static
olmalıdır. Örnek verecek olursak:
using System;
class Saat
{
public byte
hour,minute,second;
public Saat():this(0,0,0)
{
}
public Saat(byte
hour, byte minute,byte
second)
{
this.hour=hour;
this.minute=minute;
this.second=second;
}
public static Saat operator +(Saat s1,Saat s2)
{
byte THour,TMinute,TSecond;
THour=(byte)(s1.hour+s2.hour);
TMinute=(byte)(s1.minute+s2.minute);
TSecond=(byte)(s1.second+s2.second);
if (TSecond>=60)
{
TSecond-=60;
TMinute++;
}
if (TMinute>=60)
{
TMinute-=60;
THour++;
}
if (THour>=24)
{
THour-=24;
}
return new
Saat(THour,TMinute,TSecond);
}
}
class Class1
{
[STAThread]
static void Main (string[] args)
{
Saat
s1=new Saat(10,12,24);
Saat
s2=new Saat(10,13,49);
s1=s1+s2;
Console.Write("{0}:{1}:{2}",s1.hour,s1.minute,s1.second);
Console.ReadLine();
}
}
Bu örnek operator overloading’le daha
çok ilgili ancak static keyword’ünü daha iyi ifade etmek açısından güzel bir
örnek. Daha sonraki yazılarımızda detaylı olarak operator overloading’e
işlemine değineceğiz. Şu an tek yapmamız gereken static keyword’ünün ne işe
yaradığını anlamak.
Örneğimizde bir toplama işlemi
tanımladık. Bir toplama işlemini yakından inceleyecek olursak karşımızda iki
değer ve bir sonuç çıkmaktadır. İki değer (eşitliğin sağı) incelenecek olursa
ikiside aynı tipte iki class ve bu işlemin sonucunu hesapladıktan sonra geriye
yine aynı özelliklere sahip bir class dödürüyoruz. Kısacası bu toplama
işleminin Saat objesiyle hiç bir ilgisi yok. Bu işlem tamamen class’ı
ilgilendiren bir yapı ve static keyword’ü ile herhangi bir instance yaratmadan
bu işlemin tanımlanması gerçekleştirilebilmektedir.
Basit bir başka örnek ile konuyu daha
anlaşılır hale getirelim:
using System;
class Deneme
{
public static long StaticCalculate(int
x, int y)
{
return x+y;
}
public long
NonStaticCalculate(int x,int y)
{
return x+y;
}
}
class Class1
{
[STAThread]
static void Main (string[] args)
{
Console.WriteLine(Deneme.StaticCalculate(3,4));
Deneme
a=new Deneme();
Console.WriteLine(a.NonStaticCalculate(1,1));
Console.ReadLine();
}
}
Örnekte’de görüleceği üzere
StaticCalculate metodunu bir referans değeri tanımlamadan kullanabildik.
NonStaticCalculate metodunu kullanabilmek için ise bir referans değeri
tanımlamak zorunda kaldık.
Özet olarak static keyword’ünü
kullandığımızda yazdığımız metodlar global metod davranışı gösterirler.
Static keyword’üne kısaca değindikten
sonra static constructor’lara göz atabiliriz. Static constructorlar class
loader tarafından initialize işlemi gerçekleşmeden execute edilirler. Manuel
olarak, tanımlanmış bir static constructor’ı çağıramayız. Tanımlanması
sırasında ise bir modifier belirtemeyiz (public,private, ..). Static
constructorlar kullanıcı tarafından çağrılamadıkları için parametrik yapıda
kullanıma izin yoktur. Obje ile ilgili olmadıklarından static constructorlar
içerisinde this keyword’ünü de kullanamyız. Bu kurallara değindikten sonra bir
örnekle static constructor’ları inceleyelim:
using System;
class Deneme
{
static Deneme()
{
DefaultYear=(short)DateTime.Today.Year;
}
public readonly static short
DefaultYear;
}
class Class1
{
[STAThread]
static void Main (string[] args)
{
Console.WriteLine(Deneme.DefaultYear);
Console.ReadLine();
}
}
Örnekte de görüldüğü üzere readonly bir
değişkene static constructor içerisinde bir atama işlemi gerçekleştirdik ve
bunu class’a bir referans değeri vermeden kullanabildik. Bu arada constructor
içerisinde kullandığımız atamaya dikkat edecek olursak; DateTime class’ı
içerisindeki Today.Year yapısının’da referans atanmadan kullanılabilmesidir.
Buda static metod ve değişken kullanımına iyi bir örnektir.
Hiç yorum yok:
Yorum Gönder