Nesneler ve Türler
Sınıflar ve Yapılar Arasındaki Farklılıklar Sınıf Üyeleri Değer ve Referans Türde Olan Aktarımlar Yapıcılar ve Statik Yapıcılar Read-Only Statik Sınıflar Object Sınıfı
Sınıflar Sınıflar türleri tanımlar. Durum (State) Davranış ( Behavior) Erişim (Access) Nesneler türün bir örneğidir. Çoklu örnekler oluşturulabilir. Her bir örnek farklı bir durumu içerir. Her bir örnek aynı davranışı içerir.
Sınıflar, nesneleri oluşturmakta kullandığımız şablonlardır. Her nesne, oluşturulduğu sınıfın bir örneğidir.
Sınıflar referans tür yaratırlar. Nesneler heap de tutulurlar. Değişkenler nesneye işaret ederler.
Erişim Belirteçleri Bir türe veya üyeye olan erişimin şeklini belirtirler.
Sınıfların Üyeleri C# ortamındaki sınıfların üyeleri 2 tanedir: Veri Üyeleri (Data Members) Fonksiyon Üyeleri (Function Members)
Data Members Field, Constant ve Event ler bu kategoridedir. Data üyeleri static veya instance olabilirler.
Function Members Metod, Property, Constructor, Finalizer, Operator ve Index ler bu kategoridedir.
Metotlar C# ta bildirilen bütün metotlar mutlaka bir sınıfın içinde olmalıdır. Bir sınıfın üyesi olmayan metotlar bildirilemez. Metotları tanımlarken kullanılan bildirim şu şekildedir: [erişim belirteçleri] <geri dönüş tipi> Metot İsmi (parametreler) Metot kodları
using System; class metotlar_1 static int Topla(int a, int b) return a + b; static void Main() int sonuc = Topla(10, 20); Console.WriteLine(sonuc);
using System; class metotlar_2 static void Main() Yaz(20); Yaz("String İfade..."); Yaz(12.34f); static void Yaz(object o) Console.WriteLine(o.ToString()); // return;
static void islem(int a, int b) Console.WriteLine(a + b); return; static void Main(string[] args) double x, y; x = 5.45D; y = 6.88D; islem(x, y); Console.ReadLine();
using System; class metotlar_3 static int BuyukBul(int a, int b) if (a > b) return a; return b; static void Main() int s1, s2; Console.Write("1. Sayıyı Girin:"); s1 = Convert.ToInt32(Console.ReadLine()); Console.Write("2. Sayıyı Girin:"); s2 = Convert.ToInt32(Console.ReadLine()); int enbuyuk = BuyukBul(s1, s2); Console.WriteLine("En büyük: 0\'dir.", enbuyuk);
using System; class metotlar_4 static int BuyukBul(int a, int b) if (a > b) return a; return b; static int BuyukBul3(int a, int b, int c) return BuyukBul(a, BuyukBul(b, c)); static void Main() int s1, s2, s3; Console.Write("1. Sayıyı Girin:"); s1 = Convert.ToInt32(Console.ReadLine()); Console.Write("2. Sayıyı Girin:"); s2 = Convert.ToInt32(Console.ReadLine()); Console.Write("3. Sayıyı Girin:"); s3 = Convert.ToInt32(Console.ReadLine()); int enbuyuk = BuyukBul3(s1, s2, s3); Console.WriteLine("En büyük: 0\'dir.", enbuyuk);
Metotlara Parametre Aktarımı Bir nesnenin değerini metoda aktarmaya değer ile parametre geçme (call by value), bir nesnenin referansını metoda geçmeye ise referans ile parametre aktarımı (call by reference) denilmektedir.
using System; class RefOrnek static void DegerTipi(ref int x) x = 111; static void Main() int x = 25; DegerTipi(ref x); Console.WriteLine(x); ref parametreleri aktarılırken mutlaka ilk değer verilmelidir. Eğer ki, ilk değer verilmeyecekse ref yerine out anahtar sözcüğü kullanılmalıdır.
using System; class OutOrnek static void DegerTipi(out int x) x = 111; static void Main() int x; DegerTipi(out x); Console.WriteLine(x);
Metotların Aşırı Yüklenmesi (Method OverLoading) Metotları aşırı yükleyerek (overloading) aynı isimli birden fazla metot tanımlanabilir. Çalışma zamanında bu metotlar nasıl belirlenecek? İsimler aynı olduğuna göre hangi metodu çağırdığımız nasıl anlaşılacak?
Özellikler (Properties)
Auto-Implemented Properties
Yapıcılar (Constructors) Nesneleri oluşturmak için var olan özel metodlardır. Varsayılan değerleri atar (Default Constructor) Birden fazla yapıcı tanımlanabilir. Overload edilmiş metodlar farklı parametre almalıdır.
Bir nesne dinamik olarak yaratıldığı anda otomatik olarak çalıştırılan metotlar vardır. Bu metotlar sayesinde bir nesnenin üye elemanlarına ilk değerler verilebilir ya da gerekli ilk düzenlemeler yapılabilir. Bu metotlara yapıcı metotlar (constructors) denir. Yapıcı metot tanımlanmasa dahi her sınıfın varsayılan bir yapıcı metodu (default constructor) mutlaka bulunur.
using System; class Toplama public int X; public int Y; public Toplama(int x,int y) Console.WriteLine("Yapıcı metot çalıştı..."); X = x; Y = y; public int Islem() return X + Y; class Program static void Main() Toplama t = new Toplama(25,50); //Console.WriteLine(t.Islem());
Varsayılan Yapıcı Metot (Default Constructor) Otomatik olarak tanımlanmış sınıf nesneleri oluşturulduğu anda çağrılan yapıcı metottur. Her sınıf nesnesinin en az bir yapıcı metodu bulunur. Varsayılan yapıcı metodun parametresi yoktur. Nesnenin üye elemanlarına varsayılan değerlerini atar. Eğer kendi yapıcı metodumuzu tanımlarsak varsayılan yapıcı metotlar çalıştırılmaz.
using System; class Toplama public int X; public int Y; public int Islem() return X + Y; public void Yaz() Console.WriteLine("X = 0", X); Console.WriteLine("Y = 0", Y); class Program static void Main() Toplama t = new Toplama(); t.yaz();
using System; class Toplama public int X; public int Y; public Toplama() X = -1; Y = -1; public int Islem() return X + Y; public void Yaz() Console.WriteLine("X = 0", X); Console.WriteLine("Y = 0", Y); class Program static void Main() Toplama t = new Toplama(); t.yaz();
Birden fazla yapıcısı olan sınıflar olabilir. Eğer herhangi bir yapıcı belirtilmemişse değişkenlere varsayılan (default) değerleri atanır.
this Anahtar Sözcüğü
Static Yapıcılar C++ ve VB 6.0 da olmayan bir özelliktir.
Readonly
Yıkıcılar (Destructors) ve Dispose() Metodu Nesnelere erişimin mümkün olmadığı zamanlarda nesnelerin bellekte kalmasının bir anlamı yoktur. C# dilinde gereksiz nesneleri kontrol eden ve bunların kullandıkları belleği zamanı gelince iade eden (Garbage Collection) bir mekanizma bulunur.
Gereksiz nesne toplayıcısı (Garbage Collector) programcı yerine gereksiz nesnelerin kullandıkları bellek alanını iade eder. Yalnız bu sistem nesnelerin yok edilmesi ve belleğin iadesinin, faaliyet alanının sona erdiği noktada yapılacağını garanti etmez. Yani nesnenin ne zaman yok edileceği kesin bilinemez. Bu durumda yıkıcı metotlar (destructors) bellek iade işleminden hemen önce çalışarak bu belirsizliğin çözümünde yardımcı olurlar.
Dispose( ) Metodu Oluşturulan bir nesnenin kullandığı kaynakların geri alınması için kullanılabilecek yöntemlerden bir diğeri de Dispose() metodudur. IDisposable arayüzü kullanılarak yapılır.
Yıkıcı metotlar bildirilirken sınıf isminin önüne ~ işareti eklenir. Herhangi bir dönüş değeri ve parametresi yoktur. Erişim belirteci de kullanılmaz. Bir sınıfın sadece bir tane yıkıcı metodu olabilir.
using System; class Yikici ~Yikici() Console.WriteLine("Yıkıcı metot çalıştı..."); class Program static void Main() Yikici y = new Yikici(); Console.WriteLine("Ana Program...");
Örnek programda y nesnesi faaliyet alanını doldurmasına rağmen hemen yok edilmemiştir. Bir alt satırda bulunan Console.WriteLine() metodu çalışmış ardından gereksiz nesne toplayıcısı işleyerek nesneyi silmiştir. Nesne yok edilirken de yıkıcı metodu çalıştırılmıştır.
Gereksiz nesne toplayıcı (Garbage Collector) programcının isteği dışında çalışmaktadır. System.GC sınıfı kullanılarak istenilen anda bu mekanizma çalıştırılabilir. Fakat bu tavsiye edilen bir kullanım değildir.
using System; class Yikici ~Yikici() Console.WriteLine("Yıkıcı metot çalıştı..."); class Program static void Main() Yikici y = new Yikici(); GC.Collect(); Console.Read(); Console.WriteLine("Ana Program...");
C# da yıkıcı metotlar genelde nesnenin kullandığı bellek alanını iade etmek için kullanılmaz. Daha çok nesne yok edilirken bir takım işlemlerin yapılması, özellikle sınıfın global üye değişkenlerinin değerlerinin işlenmesi ya da değiştirilmesi için kullanılır.
Struct C# dilinde yapılar değer tipindedir. Sınıf bildirimine çok benzer şekilde tanımlanırlar. struct anahtar sözcüğü kullanılır.
Yapılar değer tipidir ve yapı türündeki nesneler stack alanında saklanır. Yapılar da diğer tüm nesneler gibi object sınıfından türetilmiştir. Yapılar kalıtımı desteklemez, türetme yapılamaz.
using System; class Yapilar struct Ogrenci public int Numara; public string Ad; public string Soyad; public static void Main() Ogrenci ogr1; Console.WriteLine(ogr1.Numara);
using System; class Yapilar public struct Ogrenci public int Numara; public string Ad; public string Soyad; public Ogrenci(int no, string ad, string soyad) Numara = no; Ad = ad; Soyad = soyad; public static void Main() Ogrenci ogr = new Ogrenci(123,"Ali", Uzun"); Console.WriteLine("0 1 2", ogr.numara, ogr.ad, ogr.soyad);
Avantajlar Stack bellek alanında yer ayırma, kopyalama gibi işlemler heap alanından daha hızlıdır. Sınıf nesneleri Garbage Collection mekanizması ile heap alanından silindikleri için yıkıcı metotların ne zaman çağrılacağı kesin bilinemez. Yapılarda yıkıcı metot olmamasına rağmen faaliyet alanı bitiminde bellekten otomatik silinirler.
Partial Classes