static Kavramı 1 İçinde bulunduğu sınıftan nesne oluşturulmadan veya hiç bir nesneye referans olmadan kullanılabilen üyeler static olarak nitelendirilir. Metotlar ve alanlar static olarak tanımlanabilir. static Metodlar static olma durumunun en bilinen örneği Main() metodudur. Main(), herhangi bir nesne oluşturulmadan önce çağırılması gerektiği için static olarak tanımlanmıştır. Başka bir deyişle de bir nesne metodun üreteceği sonucu etkilemeyecek ise o metot static olarak tanımlanır. Diğer adı ile sabit metotlar olarak da bilinirler. Static olarak tanımlanan bir metoda program çalıştığı sürece erişilir, böylece sadece bir metot ile birden çok nesne çağırılır. Bu metotlar bir nesne ile var olan metotlar değil, bir sınıfın kendisinde tanımlanmış olan metotlardır. Örnek verirsek Math sınıfının Pow metodu bir statik metottur. Ve bu metot ile bir değerin üssünü yani üssel ifade değerini hesaplayabiliriz. Bir metodu static olarak tanımlayabilmek için metot isminin hemen önünde static deyimini kullanırız. Oluşturulan veya oluşturulmuş olan her bir statik metodu ilgili sınıfın adının ardından nokta (.) kullanarak metot adını belirterek kullanabiliriz. Yani SınıfAdı.MetotAdı(ilgili parametre(ler)) şeklinde kullanılır, örnek verirsek; Math.Sqrt( 2500.0 ) Bunu kullanarak ilgili değerin sonucunu 50 buluruz. Burada kullanmış olduğumuz Math sınıfının içinde yer alan static Sqrt metodudur. Bu metot ile ilgili argümanın karekök değerini buluruz. class Matematik public static int Toplamint x, int y int z x y; return z; Görüleceği üzere herhangi bir nesneye bağımlı olmadan bu sınıfı ve ilgili static metodu kullanabiliyoruz. Math sınıfında yer alan tüm metotlar statik metottur. Dolayısı ile hepsinin kullanımı üstte görüldüğü gibidir, yani önce Math sınıfı yazılır sonra nokta (.) ve daha sonra da ilgili metodun adı gelir. Örnek olarak mesela sık sık kullanmış olduğumuz Console.WriteLine(), Consol.Write() bunlarda static metotlardır. Her ikisi de Console sınıfında yer alan static metotlardır. class Program static void Mainstring args int sonuc Matematik.Toplam3, 5; Console.WriteLinesonuc; Yukarıdaki örnekte "Matematik" sınıfı altında "Toplam()" isimli static metodu oluşturuldu ve program sınıfının static Main() metoduna verilebilecek her tamsayı x ve y değerleri için toplama işlemi gerçekleşir. Böylece static olarak tanımlanmış sınıf metotlarına static olmayan sınıf üyelerininde 1 Bu başlık altındaki yazılar http://bidb.itu.edu.tr/seyirdefteri, http://onursalkaya.blogspot.com.tr, http://www.ismailgursoy.com.tr/ internet adreslerinden yararlanılarak derlenmiştir.
erişebileceği görülür. Aşağıdaki örnekte ise static olmayarak tanımlanın bir metodun static "Toplam()" metoduna ulaşabildiği görülür. public int Toplamlarint x, int y, int m int sonuc 0; for int i 0; i m; i sonuc Toplamx, y; return sonuc; static bir metot olan "Toplam()" metodundan static olmayan Toplamlar metoduna erişilmek istenirse "An object reference is required for the nonstatic field, method, or property StaticKavrami.Matematik.Toplamlar(int, int, int)" hatası ile karşılaşılır. static Alanlar Bir sınıf içerisinde bulunan alanlarda static olarak tanımlanabilir. Eğerstatic kavramı yok ise sınıftan nesne oluşturulması gerekir. Bir değişken static ise sınıfın tamamıyla ilgilidir ve buna "sınıf alanı" adı verilir; static değil ise bir nesneyle ilgilidir, buna da "nesne alanı" adı verilir. Sınıf alanları, nesneye değil sınıfa ait bilgiler içerir. Ayrıca, sınıf alanlarından oluşturulan her nesne için bellekte bir tane sınıf alanı vardır ve her şekilde ona erişilir. Aşağıdaki örnekte "Matematik" sınıfına ait y ve z nesne örnekleri oluşturulmuştur ancak bunların değerleri static olan x değerine eşittir. x değişkenine de metotta olduğu gibi SınıfAdı.DeğişkenAdı şeklinde ulaşıldığı görülür. static alanların bir diğer özelliği ise çalışma zamanında değerlerinin değiştirilebiliyor olmasıdır. Bunun için aşağıdaki örnek uygulamada "xdeğistir()" adındaki metot kullanılmştır. class Matematik public static double x5.5; public void xdegistirint y x y; class Program static void Mainstring args Matematik y new Matematik; Console.WriteLineMatematik.x; Matematik z new Matematik; Console.WriteLineMatematik.x; z.xdegistir4; Matematik t new Matematik; Console.WriteLineMatematik.x;
Bu örneğin çıktısında y ve z isimli nesnelerinin 5.5 değerini aldıklarını, z değeri üzerinden "xdegistir()" metodu çağırıldıktan sonra, oluşturulan t isimli nesne örneğinin static x değişkeninin yeni değeri olan 4 ü aldığı görülür. Yeni bir metot çağrısı ile static x değişkeninin değeri değiştirilene kadar oluşturulan her nesne örneği 4 değerini alır. static Yapıcı Metod (constructors) Static yapıcı metodu çoğunlukla bir sınıfın static değişkenlerine ilk nesne örneği oluşturulduğunda bir kereliğine değer atmak için kullanılır. public class Dikdortgen public static int kontrolalani 20; static Dikdortgen kontrolalani 35; static Sınıflar Bir sınıf static olarak tanımlanıyosa, içerisindeki bütün üyeler static olarak tanımlanmak zorundadır. Amaç tüm üyeleri static olmaya zorlamaktır. Static sınıfların özellikleri aşağıdaki gibidir: -C# 2.0 ile birlikte static anahtar sözcüğü class'lara da uygulanabilir bir hale geldi. -Bir class'a static anahtar sözcüğü uygulandığından içindeki tüm üyeleri static olmaya zorlamış olur. -Tek bir özel nesne örneği, sınıfın kullanıldığı anda ram'in Static bölgesine çıkar. -Static sınıflar new ile örneklenemezler. Dolayısıyla heap'te nesne örnekleri bulunmaz. public static class Kare public static double kenar; public static double Cevre return kenar * 4; public static double Alan return kenar * kenar; public class Program public static void Main Kare.Kenar 36.84; Console.WriteLine"Kare Özellikleri"; Console.Write"Kenar: "; Console.WriteLineKare.kenar; Console.Write"Cevre: "; Console.WriteLineKare.Cevre;
Console.Write"Alan: "; Console.WriteLineKare.Alan; sealed Kavramı 2 Nesne yönelimli programlamanın temel felsefelerinden biri de kalıtımdır. sealed, sınıflara ve üyelere(metot ve property) uygulanabilen bir anahtar sözcüktür. Anlamı; kapalı, mühürlü şeklinde çevirilebilir. Sınıflar için kalıtımı, üyeler için ise override edilmeyi önler. Basit örnekler üzerinden inceleme yapalım. Birbirinden türetilen A,B ve C sınıfları olsun. class Program : C static void Mainstring args public class A public string AProperty get; set; public class B : A public string BProperty get; set; public class C : B public string CProperty get; set; Main metodu içerisinde Program tipinden bir nesne örneklediğimizde, Program sınıfının C sınıfından kalıtılması sebebiyle ilgili property lere erişebildiğimizi görürüz. Zaten kalıtımın temel mantıklarından birisi de budur. 2 Bu başlık altındaki yazılar http://onursalkaya.blogspot.com.tr/ internet adresinden alınmıştır.
Projeyi yukarıdaki hali ile derlediğimizde herhangi bir hata almayacağız. Şimdi de amacımız, C sınıfından yapılacak bir kalıtımı önlemek. Bunun için C sınıfına sealed anahtar sözcüğünü uygulamamız yeterli olacaktır. public sealed class C : B public string CProperty get; set; sealed ile, C sınıfından herhangi bir kalıtım yapılması halinde derleme zamanı hatası alınmasını sağladık. Son hali ile projemizi derlediğimizde aşağıdaki gibi bir hata mesajı ile karşılaşacağız. 'sealedkeyword.program': cannot derive from sealed type 'sealedkeyword.c' Program sınıfının, sealed olarak işaretlenmiş olan C sınıfından kalıtamayacağı mesajı aldık. Dolayısı ile artık C sınıfından kalıtım yapamayacağız. Şimdi de A sınıfı içerisine virtual bir metot ekleyelim. Daha sonra da B sınıfında bu metodu override edelim. public class A public virtual void Test Console.WriteLine"A sınıfındaki Test metodu çalıştı"; public class B : A public override void Test Console.WriteLine"B sınıfındaki Test metodu çalıştı"; Program sınıfını B sınıfından kalıtalım ve Test metodunu override etmeye çalışalım.
Görüldüğü gibi Test metodu da override edilebilir bir metot olarak karşımıza çıktı. class Program : B public override void Test Console.WriteLine"Program sınıfındaki Test metodu çalıştı"; static void Mainstring args Programı derlediğimizde hata ile karşılaşmayacağız. Şimdi de B sınıfına giderek Test metodumuzu sealed olarak işaretleyelim. public class A public virtual void Test Console.WriteLine"A sınıfındaki Test metodu çalıştı"; public class B : A public sealed override void Test Console.WriteLine"B sınıfındaki Test metodu çalıştı"; Tekrar program sınıfına dönelim ve Test metodunu override etmeyi deneyelim. Artık override edilebilecek üyeler listesinde Test metodunu göremeyeceğiz. Sebebi, sealed ile işaretlenmiş olması, yani artık override edilemeyecek olmasıdır. Derleyiciden yardım almayarak manuel olarak override ettiğimizde ise derleyici tarafından bir hata mesajı alacağız. class Program : B
public override void Test Console.WriteLine"Program sınıfındaki Test metodu çalıştı"; static void Mainstring args Programı derlediğimizde alacağımız hata mesajı aşağıdaki gibi olacaktır. 'sealedkeyword.program.test': cannot override inherited member 'sealedkeyword.b.test' because it is sealed Framework içerisinden örnek vermek gerekirse; string tipi de sealed olarak işaretlenmiştir. Yani string tipinden kalıtım yapamayız.