Sınıflar nesne yönelimli programlamanın en önemli ögesidir. C# %100 nesne yönelimli bir dil olduğu için tüm metot ve özellikler sınıflar içerisinde yer alır. Sınıfları veri yapısı veya veri yapısı modeli olarak tanımlayabiliriz.
Sınıflara Niçin İhtiyaç Duyarız ?
Metotları anlatırken; “Bütün işlemleri tek bir metot içerisinde yapmak yerine alt programlara yani metotlara ayırmak; kod tekrarını azaltır, okunabilirliği arttırır ve programın daha kolay geliştirilebilmesini sağlar. ” demiştik. (Bkz: C# – Metotlar)
Aynı şekilde; program geliştirirken bütün metotları tek bir sınıfın içinde tanımlamak yerine benzer görevleri yerine getiren metotları bir sınıf içerisinde tanımlamak kod tekrarını azaltır, okunabilirliği arttırır ve programın daha kolay geliştirilebilmesini sağlar. Örneğin veritabanı işlemlerini (ekleme, silme, güncelleme, arama…) yapan metotları diğer metotlardan ayırıp farklı bir sınıf içerisinde tanımlamak daha doğru bir yaklaşım olacaktır.
Sınıf Bildirimi ve Üye Elemanlar
Sınıfların üye elemanları özellikler ve metotlardır. Bir sınıf içerisinde çok sayıda özellik ve metot tanımlayabiliriz.
class SinifAdi { [Erişim Belirleyicisi] [Veri Tipi] OzellikAdi; [Erişim Belirleyicisi] [Geri Dönüş Değerinin Tipi] MetotAdi([Parametreler]) { // Metot Gövdesi } }
Sınıf ve sınıf üyelerinin bildirimi yukarıdaki şablona uygun bir şekilde yapılmalıdır.
Erişim Belirleyicisi: Metot ve özelliklere olan erişimin sınırlarını belirtmektedir.
- Private: Sadece tanımlandığı sınıf içerisinden erişilebilir.
- Public: Her yerden erişilebilir.
- Internal: Sadece bulunduğu projede erişilebilir.
- Protected: Sadece tanımlandığı sınıfta ya da o sınıfı miras alan sınıflardan erişilebilir.
Sınıf Türünden Nesneler Oluşturma
Şimdi, edinmiş olduğumuz bilgileri kullanarak konuya ilişkin bir örnek yapalım ve bu örnek üzerinden sınıfları incelemeye devam edelim.
class Ogrenci { // Özelliklere diğer sınıflardan erişebiliriz. (Public) public string AdSoyad; public int Numara; public int Sinif; // Bilgi() metoduna diğer sınıflardan erişebiliriz. (Public) public void Bilgi() { Console.WriteLine("Öğrencinin Adı:{0}", AdSoyad); Console.WriteLine("Öğrencinin Numarası:{0}", Numara); Console.WriteLine("Öğrencinin Sınıfı:{0}", Sinif); } } class Program { static void Main(string[] args) { // Ogrenci sınıfından bir nesne oluşturduk. Ogrenci ogr1 = new Ogrenci(); // Nesne içerisindeki public özelliklere değer atadık. ogr1.AdSoyad = "Serdar Yılmaz"; ogr1.Numara = 134; ogr1.Sinif = 4; // Nesne içerisindeki Bilgi() metodunu çağırarak atamış olduğumuz değerleri ekrana yazdırdık. ogr1.Bilgi(); Console.WriteLine(new string('-', 30)); // Ogrenci sınıfından bir nesne daha oluşturup farklı değerler atadık. Ogrenci ogr2 = new Ogrenci(); ogr2.AdSoyad = "Ümit Özkan"; ogr2.Numara = 118; ogr2.Sinif = 3; ogr2.Bilgi(); } }
Ogrenci isminde bir sınıf oluşturduk ve içerisindeki üye elemanları public (Her yerden erişilebilir) olarak bildirdik.
Program sınıfı içerisindeki Main metodunda; “new Ogrenci()” ifadesi ile Ogrenci sınıfından bir nesne oluşturduk. Belleğin heap bölgesinde oluşturulan bu nesneye erişebilmek için adresini, ogr1 adını verdiğimiz referans değişkenine aktardık.
Nesneler belleğin heap bölgesinde, nesnelerin adreslerini tutan referans değişkenleri de stack bölgesinde tutulur.
ogr1 referansı ile nesnenin public üyelerine erişip değerler atadık. Daha son Bilgi() metodunu çağırarak atamış olduğumuz değerleri görüntüledik.
Bir nesne oluşturduğumuz an nesne içindeki üye elemanlara varsayılan değerler atanır. Numarik ise “0”, bool türünde ise “false”, string gibi referans tipliyse “null” değeri atanır.
Programımızın sonraki satırlarında “new Ogrenci()” ifadesi ile yeni bir nesne daha oluşturduk ve adresini ogr2 referans değişkenine aktardık. Benzer şekilde; üye elemanlarına değerler atayıp, Bilgi() metodu ile atamış olduğumuz değerleri görüntüledik.
Ekran Çıktısı:
Öğrencinin Adı:Serdar Yılmaz Öğrencinin Numarası:134 Öğrencinin Sınıfı:4 ------------------------------ Öğrencinin Adı:Ümit Özkan Öğrencinin Numarası:118 Öğrencinin Sınıfı:3 Press any key to continue . . .
Son olarak Sınıflar için kilit nokta sayılabilecek bir kaç hususa değineceğiz.
Örnek programımızda iki adet nesne oluşturduk ve ilkinin adresini ogr1 değişkenine, ikincisinin adresini ogr2 değişkenine atadık. Her iki nesneyi de Ogrenci sınıfından oluşturmamıza rağmen nesneler birbirinden tamamen bağımsızdır. Çünkü içeriğin başında da belirttiğimiz gibi Sınıflar sadece birer veri modelidir. Bir sınıfı model alan çok sayıda nesne oluşturabiliriz ve bu nesneleri birbirinden bağımsız olarak kullanabiliriz.
Bir sınıftan oluşturulan nesnelerin heap bölgesinde, nesnelerin adreslerini tutan referans değişkenlerinin de stack bölgesinde tutulduğunu söylemiştik. Eğer bir sınıftan herhangi bir nesne oluşturulmazsa o sınıf bellekte her hangi bir yer kaplamaz. Özetle sınıf bildirimleri için bellekte yer tahsis edilmez.
Bir sonraki içeriğimiz de yapıcı metotlara, static üyelere ve property‘lere değinerek sınıf tasarımımızı iyileştireceğiz.
Serdar YILMAZ
Merhaba,
Aşağıdaki satırda {0} ifadesi ne için kullanılmaktadır?
Console.WriteLine(“Öğrencinin Adı:{0}”, AdSoyad);
Buradaki {0} ifadesi aslinda bir degisken icin yer tutucu vazifesi gorur. Ve bu degisken ” “(cift tirnak) tan sonra gelen degiskene tahsis edilir. bu ornekte cift tirnaktan sonra tek bir degisken gelir: AdSoyad. ve 0 bu degiskeni temsil eder. Bu satirda birden fazla degiken de yer alabilir. Ornegin;
Console.WriteLine(“Öğrencinin Adı:{0}, Öğrencinin Numarası:{1}, Öğrencinin Sınıfı:{2}”, AdSoyad, Sinif , Numara); burada AdSoyad 1. degisken, Sinif 2. degisken ve Numara ise 3. degiskendir. Bu degiskenler kendilerine tahsis edilen alanlara atanirlar. ve bu siralama ile belirlenir. Bilgisayar dunyasinda siralama 0 dan baslar. Dolayisiyla 0. degisken= AdSoyad; 1. degisken=Sinif ve 2. degisken ise= Numarayi ifade eder.
Çok Yararlı Bir Yazı Olmuş Teşekkür Ederim
çok iyi bir makale olmuş resmen tecrübe akıyor .
yalnız bir şey takıldı kafama new string(-.30) ile tam olarak ne yaptınız ne yaptınız derken çıktısını gördüm ama açıklayabilir misiniz?
Teşekkürler. String sınıfından nesne yaratırken kullanabileceğimiz yapıcı metotlar bulunmaktadır. Bu yapıcı metotlardan biri de;
public String(char c, int count);
Bu yapıcı metot sayesinde birinci parametrede gönderilen bir karakteri, ikinci parametrede belirtilen sayı adedince tekrarlatıp bir string oluşturabilmekteyiz. new string(‘-‘, 30) ile pratik bir şekilde 30 tane ‘-‘ karakterinin birleştirilmesiyle oluşan yeni bir string oluşturmuş olduk.