27 Oca 2016

C#'ta Static Sınıfı

Bir değişken, özellik veya metodun sadece alınan kopyanın değil de bütün o oluşturulan tipin olması istenilen durumlarda tanımlama static ifadesi ile yapılarak bu sağlanabilir. Alınan kopyadan kasıt sınıf adı kullanılarak türetilen nesne'dir. Örnek:

Sinif nesne1 = new Sinif();
nesne1.x = 5;
Sinif nesne2 = new Sinif();
nesne2.x = 10;
Console.WriteLine(nesne1.x);  //5
Console.WriteLine(nesne2.x);  // 10
public class Sinif
   {
      public int x;
   }
Burada, Sinif class'ından, nesne1 ve nesne2 gibi 2 farklı kopya türettik. Sinif class'ın da bulunan x değişkenine 2 farklı atama yaptık ve yazdırdık. Bunun sonucunda program ekrana 5 ve 10 yazdıracaktır. Bir tane x değişkeni olmasına rağmen iki tane nesne kullanarak bu x değişkenine 2 farklı değer verebilmekteyiz.
İşte static bu durumun yaşanmamasının istendiği durumlarda kullanılmaktadır. Aşağıda örnek bir uygulama bulunmaktadır;
static void Main(string[] args)
        {
            Sinif nesne = new Sinif();
            Sinif.setX(5); // set metodu x'e değer atamamıza yarar
            Sinif.setX(10);
            Console.WriteLine(nesne.getX());  //get metodu x'in değerine erişmemize yarar
            Console.ReadKey();
        }
        public class Sinif
        {
            private static int x;

            public static void setX(int deger)
            {
                x = deger;
            }
            public int getX()
            {
                return x;
            }
        }

Burada öncelikle Sinif class'ının içinde static olarak tanımlanan int türündeki x değişkeni private olarak tanmlanmıştır. Burdan anlamalıyız ki dışarıdan bu x değişkenine erişip, müdahale etmek ya da değerini öğrenmek için get,set metotlarını kullanmalıyız. Biz de bundan dolayı setX ve getX isimli 2 metot yazdık. İsimlerini set ve get olarak koymak zorunda değiliz fakat bu şekilde isimlendirme kod anlaşılırlığını arttıracaktır. setX metodu ile ana progamdan gönderdiğimiz parametreyi deger değişkeni vasıtasıyla x'e atadık. Artık x'in değeri o parametre oldu. get metodu ise bizim ana programdan private olarak tanımlanan x değişkenin değerini öğrenmemize yarar. Bunun için bize x'in değerini döndürür.
Burada görüleceği üzere static olarak tanımlanan x değişkeni kendisine atanan 5 ve 10 değerlerini ayrı ayrı tutamamaktadır. static tanımlanan bir değişken sadece kendisine son atanan değeri tutabilir.

Static'in bir diğer kullanımına gelirsel; eğer bir konsol uygulamasında ana programın dışında tanımlanmış metotlara bir nesne türetmeden(sınıf isminden bir kopya almadan) erişmek istersek; bu metotları static olarak tanımlamalıyız. Örnek:
static void Main(string[] args)
        {
            Console.WriteLine(sayi(5.5));   //Ekrana 6.5 yazdırılır.
            Console.ReadKey();
        }
        public static double sayi(double sonuc)
        {
            return sonuc+1;
        }

Static sınıfı  ile ilgili farklı bir örnek de aşağıda bulunmaktadır;
class Program
    {
        static void Main(string[] args)
        {
            carV2.BenzinUcteri = 3.5;
            carV2 eskiAraba = new carV2(45, 8.5);
            Console.WriteLine("Eski arabanızda bir depo ile " + eskiAraba.Mesafe + " km yol yapabilirsiniz.");
            Console.WriteLine("Eski arabanızla {0} km'de {1} liralık benzin yakarsınız.", 100, eskiAraba.MesafeUcret(100));
            carV2 yeniAraba = new carV2(65, 11.5);
            Console.WriteLine("Yeni arabanızda bir depo ile " + yeniAraba.Mesafe + " km yol yapabilirsiniz.");
            Console.WriteLine("Yeni arabanızla {0} km'de {1} liralık benzin yakarsınız.", 100, yeniAraba.MesafeUcret(100));
            Console.ReadKey();            
        }
    }
    public class carV2
    {
        public static double BenzinUcteri { get; set; } //benzin fiyatı sınıf özelliği oldu. Her araba kopyası için tekrar tanımlamamıza gerek kalmadı
        public int DepoKapasitesi { get; set; }
        public double Litre100KilometreBasi { get; set; }
        public carV2(int kapasite, double litre) //constructor
        {
            //araba tanımlarken kapasite ve kullandığı benzin miktarını yazmayı zorunlu kıldık
            DepoKapasitesi = kapasite;
            Litre100KilometreBasi = litre;
        }
        public double Mesafe
        {
            get
            {
                return DepoKapasitesi * Litre100KilometreBasi;
            }
        }
        public double MesafeUcret(double km)
        {
            return Litre100KilometreBasi * km * BenzinUcteri / 100;
        }
    }

Statik sınıfı elemanları sınıfların kopyalarına bağlı olmadıkları için tip başına 1 adet olarak tanımlanırlar. Bu, birçok kopya alınan durumlarda daha az hafıza kullanılmasını sağlar.

Bunlara ek olarak static class'da tanımlanabilir. Bir sınıfı statik tanımlamak onun bütün elemanlarının statik olduğu ya da olacağı anlamına gelir.

Hiç yorum yok:

Yorum Gönder