30 Ekim 2013 Çarşamba

C# ve Constructorlar -II

         Ş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