Showing posts with label statik üye elemanlar. Show all posts
Showing posts with label statik üye elemanlar. Show all posts

Monday, September 24, 2012

Statik Üye Elemanlar (c#)


Statik Üye Elemanlar

c# dilindeki tüm metotlara sınıflar üzerinden erişiriz. Çoğu durumda da erişim için bu sınıflardan nesneler oluştururuz.
Ancak bazı durumlarda metotları kullanmak için nesne oluşturmamız gereksiz olabilir. Bu durumda statik metotlar tanımlanır.
Statik metotlar olabiliceği gibi statik üye değişkenler ve statik yapıcı metotlarda olabilir. Bir üye elemanının statik
olduğunu bidirmek için bildirimden önce static anahtar sözcüğü eklenir.

Statik elemanlar bir sınıfın global düzeydeki elemanlarıdır. Yani statik üyeleri kullanmak için herhangi bir nesne
 tanımlamıza gerek yoktur. Şimdi sırasıyla üye elemanları inceleyelim.



STATİK METOTLAR



Metotlar konusunda Math sınıfının çeşitli metotlarını görmüştük Bu metotları herhangi bir nesne oluşturmadan kullanabildik.
Örneğin bir sayının karekökünü almak için
Math.sqrt(sayi);
ifadesini kullanmamız yeterliydi. Karekök alma işlemi genel bir işlem olduğu için bu tür işleri yapmak için nesne tanımlamamız
çok saçma olurdu. Neyse ki c# dilini tasarlayanlar bunu düşünmüşler. Statik Metotlara sınıf adı ile ulaşılır. Örneğin
aşağıdaki Topla() metodu statik olarak tanımlanmış ve Main() metodu içersinden çağrılmıştır.

class cebir
{
    public static int Topla(params int[] dizi)
    {
        int toplam = 0;
        for (i = 0; i < dizi.Length; i++)
            toplam += dizi[i];
        return toplam;
    }
}

class Anasinif
{
    static void main()
    {
        int i;
        i = cebir.Topla(5, 6, 8);
        Console.Write(i);
    }
}


gördüğümüz gibi Cebir sınıfından herhangi bir nesne tanımlanmadan Topla() metoduna ulaştık.


Peki statik bir metoda nesne üzerinden erişmemiz mümkün mü? Hayır, mümkün değil. Örneğin aşağıdaki c nesnesi üzerinden
Topla() metoduna erişmeye çalışmak hatalıdır.
Cebir c= new cabir();
c.Topla(5,6,8);

Sınıflarımızı tanımlarken nesneler ile doğrudan iş yapmayan metotları statik olarak bildirmemiz gerekir.


Şu ana kadar yaptığımız tüm örneklerde main metodunun statik olarak tanımlamıştık. bunun nedeni main metodunun çalışması
için herhangi bir sınıf nesnesine ihtiyaç duymadan çalışmasını sağlamaktır.

Static anahtar sözcüğünü kullanırken erişim belirleyiciden önce veya sonra koymamız fark yaratmaz.





Bir statik metot içersinden sınıfn diğer statik metotları çağrılabilir. Ancak normal bir üye metot çağrılamaz.
Çünkü normal metotlar nesneler üzerinden işlem yaparlar. dolayısıyla nesnelerin adresleri gizlice metoda this referansı ile
gönderilir. Ancak statik metotlar sınıfın global metotlar olduğu için this referansları yoktur.

aşağıdaki bildirim geçerlidir.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication12
{
    class Program
    {
         static void   Main()
        {
            metot2();
            Console.ReadLine();
        }
        public static void metot1()
        {
         
            Console.WriteLine("metot1");
        }

        public static void metot2()
        {
            metot1();
            Console.WriteLine("metot2");
        }

     
    }
}
// ekrana metot1 metot2 yazar.

eğer metot içerisinden cağırılan metot static değil iste nesne üzerinden çağırılmalıdır.
aşağıdaki örnek gibi;



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication12
{
    class Program
    {
         static void  Main()
        {
            metot2();
            Console.ReadLine();
        }
        public void metot1()
        {
         
            Console.WriteLine("metot1");
        }

        public static void metot2()
        {
            Program c = new Program();
            c.metot1();

            Console.WriteLine("metot2");
        }

     
    }
}
// ekrana metot1 metot2 yazar.





Statik olan bir metot statik olmayan bir metot içersinden çağırabilinir. yani çağırılan metodun statik olması gerekir
aşağıdaki örnekte görebilirsiniz.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace statikler
{
    class Program
    {
         static void   Main()
        {
            Program c = new Program();

             c.metot2();
             Console.ReadLine();
        }
        public static void metot1()
        {
         
            Console.WriteLine("metot1");
        }

        public  void metot2()
        {
            metot1();
            Console.WriteLine("metot2");
        }

     
    }



kısaca statik olarak tanımlanan bir metot herhangi bir metot içersinden nesne oluşturulmadan cağırılabilinir.




STATİK YAPICI METOTLAR



Normal metotlar gibi yapıcı metotlarda statik olabilir. Statik yapıcı metotlar bir sınıfın statik değişkenleri ile ilgili
işlemler yapmada kullanılır. Bir nesne ilk defa yaratıldığında statik üye değişkenini değiştirmek için genellikle statik
yapıcı metotlar tanımlanır. Statik olan bir metot ile statik olmayan bir değişkeni değiştirmek nasıl mümkün değil ise
statik olan yapıcılarda statik olmayan değişkenleri değiştiremez.

Statik metotların bildirilmesi normal metotların bildirim ile aynıdır. Sadece bildirimin başına static sözcüğü eklenir.

aşağıdaki örneği ve çıktısını inceleyelim.

using system
{
 class oyuncu
  {
     puplic oyuncu()
     {
        console.writeline("Statik olmayan yapıcı");
     }
 
     static oyuncu()
     {
        console.writeline("Statik yapıcı");
     }
}

 class Anasınıf
  {
    puplic static void main()
     {
         oyuncu x = new oyuncu();
         oyuncu o = new oyuncu();
         console.readline();
     }
}

Bu programın çıktısı;

Statik yapıcı
Statik olmayan yapıcı
Statik olmayan yapıcı

şeklindedir.

Görüldüğü gibi o nesnesi oluşturulduğunda hem statik yapıcı metot hem de statik olmayan metot çağrılmıştır(önce statik yapıcı
metot çağrılmış). Ancak x nesnesi oluşturulduğunda sadece statik olmayan metot çağrılmıştır.

Statik yapıcı metotlar herhangi bir parametre almazlar. Yani parametreli statik yapıcı metot tanımlanamaz.
Statik yapıcı metotların erişim belirleyicileride yoktur.

Bir nesneyi hangi yapıcı metot ile oluşturursak oluşturalım satatik yapıcı metot mutlaka ilk nesne tanımlandığında çalışır.


Statik yapıcı metotlar genellikle statik değişkenler ile ilgili işlemler yapılır. Ama bu zorunlu değildir. Örneğin aşağıdaki
kaynak kodda her oyuncu nesnesi oluşturulduğunda statik Toplam değişkeni 1 artırılıyor ve her oyuncu değişkeni işlevini
bitirdiğinde yıkıcı işlev yardımıyla Toplam değişkeni 1 azaltılıyor.




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
    class Oyuncu
    {
        public static int Toplam;

        public Oyuncu()
        {
            Oyuncu.Toplam++;
        }
        static Oyuncu()
        {
            Toplam = 0;
        }

        ~Oyuncu()
        {
            Console.WriteLine("Bir oyuncu gitti...");
            Toplam--;
        }
    }
    class Anasinif
    {
 
        static void Main()
        {

            Oyuncu o = new Oyuncu();
            Console.WriteLine("toplam oyuncu = " + Oyuncu.Toplam);
            Oyuncu x = new Oyuncu();
            Console.WriteLine("toplam oyuncu = " + Oyuncu.Toplam);
 
        }      
    }
}


bu programın ekran görüntüsü aşağıdaki gibidir.

toplam oyuncu = 1
toplam oyuncu = 2
Bir oyuncu gitti...
Bir oyuncu gitti...