Statik Sınıflar (Static Classes) C#

Önceki yazıda, bir sınıfın statik üyelerine erişmek için o sınıftan bir nesne oluşturmamıza gerek kalmadığını doğrudan sınıfın adını kullanarak erişebileceğimizi hatta bu üyelere, oluşturulmuş bir instance üzerinden erişilemeyeğini söylemiştik. İçerisinde sadece statik üye içeren bir sınıfı ele aldığımızda hiç bir zaman bu sınıftan türemiş bir nesneye ihtiyacımızın olmayacağını söyleyebiliriz ama bu durum, bu sınıftan instance oluşturamayacağımız anlamına gelmemektedir.

class Program
{
    static void Main()
    {
        Islem o1 = new Islem();//Instance oluştur
        //o1.KareAl(4);//HATALI DURUM
        Islem.KareAl(4);
    }//Main

    class Islem
    {
        private int _sayi;

        public static void KareAl(int Sayi)
        {
            Console.WriteLine("Sayının karesi :" + Sayi * Sayi);
        }//KareAl
    } //Islem

}//Program

Görüldüğü gibi sadece statik üye(KareAl() metodu) içeren Islem sınıfından bir instance oluşturabilmekteyiz. Oysa böyle bir sınıf için memory harcamanın hiçbir anlamı bulunmaktadır. Programcının bu sınıftan instance oluşturmasını engellemek için sınıfın default constructor’ü private olarak tanımlanabilir.

class Islem
{
    //Default constructor, private olduğundan sınıfa ait nesne örneği oluşturulamayacaktır.
    private Islem() {
    }

    private int _sayi;

    public static void KareAl(int Sayi)
    {
        Console.WriteLine("Sayının karesi :" + Sayi * Sayi);
    }//KareAl
} //Islem

C# 2.0 ile birlikte, sınıfın kendisinin statik olarak tanımlanması sağlanarak bu sıkıntı işin başında halledilmiştir. Böylece içerisinde sadece statik üye içeren sınıflardan new operatörü kullanılarak hiçbir şekilde instance oluşturulmamış olacaktır. Statik sınıflar, static ifadesiyle tanımlanır. Statik bir sınıf, bu sınıfı içeren herhangi bir program veya namespace yüklendiği zaman otomatik CLR tarafından memory’e taşınır.

class Program
{
    static void Main()
    {
        Islem o1 = new Islem();//HATALI DURUM
        //Cannot create an instance of the static class 'Program.Islem'
    }//Main

    //Islem sınıfı static olarak tanımlandığı için bu sınıftan nesne oluşturulamayacaktır
    static class Islem
    {
        static int _sayi;//Static olarak tanımlanmalıdır

        public static void KareAl(int Sayi)
        {
            Console.WriteLine("Sayının karesi :" + Sayi * Sayi);
        }//KareAl
    } //Islem

}//Program

Statik sınıfları, nesneye bağımlı olmayan, nesne bazlı işlemlerinin yapılmadığı durumlarda tercih ederiz.
Statik sınıflar,
< ıl>sadece statik üye içerebilir,
< ıl>içerisinde herhangi bir constructor(default, overload) tanımlanamaz,
< ıl>başka bir sınıftan inherit edilemez .NET nesne mantığı gereği System.Object sınıfından türemişlerdir,
< ıl>bu sınıflardan statik te olsa başka sınıflar türetilemez.

Statik sınıflarda, üyelerin de statik olarak tanımlanma zorunluluğu kafa karıştırmaktadır. Belki de Microsoft, daha sonraki sürümlerde bunu zorunlu olmaktan çıkarır.

Statik Sınıflar (Static Classes) C#” üzerine 3 düşünce

  1. Bayram Çelik

    [quote]
    çerisinde herhangi bir constructor(default, overload) tanımlanamaz,..
    [/quote]
    Statik siniflarda static constructor tanimlayabilirsin, parametresiz

    Cevapla
  2. Ahmet Kaymaz Yazar

    Bu yazıda sadece o satırı okuduğunuzda o şekilde anlaşılması doğaldır. Fakat bu yazının ilk bölümü olan Statik Üyeler (Static Members) makalede yapıcı yordamların (constructor) tatik olabileceği anlatılmıştır. Bu yazıda da statik sınıfların sadece statik üyeler içerebileceği yazılmaktadır. Bu yazılar draft olduğu için cümle düşüklüğü olabilir. Fakat kitapta bunlar detaylı bir şekilde ele alındı. Yine de o cümleyi şu şekilde değiştirmemiz doğru olacaktır; “Statik sınıflar, nesne yapıcı yordamları (instance constructor) içeremez sadece statik yapıcı yordam (static constructor) içerebilir. Ayrıca statik olmayan bir sınıf ta static constructor içerebilir.” Haklısınız, uyardığınız için teşekkür ederim.

    Cevapla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.