Ö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,
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.




Mart 20th, 2009 at 01:10
[quote]
çerisinde herhangi bir constructor(default, overload) tanımlanamaz,..
[/quote]
Statik siniflarda static constructor tanimlayabilirsin, parametresiz
Mart 20th, 2009 at 11:59
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.