C# Yapı ve Sınıf arasındaki farklılıklar
Sizce int, double, byte birer nedir? “Sınıftır!” dediğinizi duyar gibiyim. Yaklaştınız ancak tam olarak sınıf değil. Temel veri türleri (int, double, vb.) birer yapıdır. int türünden tanımladığımız bir a değişkeni/özelliği de bir yapı nesnesidir.
C# Yapı ve Sınıf arasındaki farklılıklar
Sizce int, double, byte birer nedir? “Sınıftır!” dediğinizi duyar gibiyim. Yaklaştınız ancak tam olarak sınıf değil. Temel veri türleri (int, double, vb.) birer yapıdır. int türünden tanımladığımız bir a değişkeni/özelliği de bir yapı nesnesidir. Peki sınıf ile yapı arasında ne fark var? Aşağıdaki kodu inceleyiniz
1
2
int a=5;
Sinif b=23;
Buraya kadar ikisi de birbirinin aynısı gibi. Bu koddan Sinif sınıfının içinde bir implicit metot olduğunu ve atanan değerin sınıf içindeki int türünden bir özelliğe atandığını çıkarabiliriz. Şimdi bu kodu şöyle geliştirelim:
1
2
3
4
5
6
7
int a=5;
Sinif b=23;
int c=a;
Sinif d=b;
a=10;
b=100;
Console.WriteLine("{0}-{1}-{2}-{3}",a,b.Sayi,c,d.Sayi);
Bu kodda int c=a; satırında a’nın tuttuğu değer c’ye atanır. Sinif d=b; satırında ise d nesnesi b nesnesinin bellekteki adresini bulur ve o adresteki değeri tutar. Gördüğünüz gibi sınıf nesneleri birbirine adres gösterme yoluyla atanırken yapı nesneleri birbirine değer kopyalama yoluyla atanır. Bu kodda b nesnesinde yapılan bir değişiklik d nesnesini, d nesnesinde yapılan bir değişiklik de b nesnesini etkileyecektir. Ancak c nesnesinde yapılan bir değişiklik a nesnesini, a nesnesinde yapılan bir değişiklik de c nesnesini etkilemeyecektir. Ancak tabii ki sınıf nesnelerinin ikisini de başka bir değer atayarak ya da new anahtar sözcüğü ile oluşturmuş, sonra atama işlemini yapmışsak bu sefer değer kopyalama yoluyla birbirlerine atanırlar.
Kendimiz de int, float gibi yapılar oluşturabiliriz. Yapı yaratmak sınıf yaratmaya oldukça benzer, yalnızca class anahtar sözcüğü yerine struct anahtar sözcüğü kullanılır. Örnek:
1
2
3
4
5
struct YapiAdi
{
public int Ozellik1;
public string Ozellik2;
}
Yapılarla ilgili bilmeniz gerekenler:
- Tıpkı sınıflar gibi yapılarda da new operatörüyle nesne yaratılabilir. new anahtar sözcüğünü kullandığımızda yapının varsayılan yapıcı metodu veya varsa kendi tanımladığımız yapıcı metot çalıştırılır.
- Tıpkı sınıflardaki gibi YapiAdi nesne; yazarak bir yapı nesnesini kullanılabilir hâle getiremeyiz. Ya değer atamamız ya da new anahtar sözcüğünü kullanmamız gerekir.
- Bir yapı türündeki nesne bir metoda parametre olarak gönderildiğinde metodun içinde nesnenin değiştirilmesi esas nesneyi değiştirmez. Ancak sınıf nesnelerinde değiştirir.
- Tıpkı sınıflardaki gibi yapılarda da birden fazla yapıcı metot yaratabiliriz. Ancak yapılarda parametre almayan bir yapıcı metot bildiremeyiz. Hatırlarsanız sınıflarda bildirebiliyorduk.
- Bir yapının yapıcı metodu bildirildiğinde yapıcı metodun içinde yapının bütün özelliklerine ilk değer verilmesi gerekir.
- Yapı nesnelerinin faaliyet alanı sonlandığında otomatik olarak bellekten silinirler. Hatırlarsanız sınıf nesnelerinin faaliyet alanı sonlandığında garbage collection (çöp toplama) mekanizması devreye giriyordu. Ancak garbage collection mekanizmasının nesnenin faaliyet alanı sonlanır sonlanmaz devreye girme garantisi yoktu. Özetle sınıf nesnelerinin aksine yapı nesnelerinin tam olarak ne zaman bellekten silindiğini anlayabiliriz.
- Yapılarda yıkıcı metot yaratılması yasaklanmıştır.
- Sınıflarda olduğu gibi yapılarda da sahte özellik (get ve set bloklu özellik) ve indeksleyici kullanabiliriz.
- Yapı nesneleriyle ilgili işlemler, sınıf nesneleriyle ilgili işlemlerden daha hızlı gerçekleşir.
- Tıpkı sınıflardaki gibi normal metotlar da bir yapı içerisinde bildirilebilir. Ayrıca üye elemanlar static olabilir.
- Tıpkı sınıflardaki gibi bir yapı içerisindeki özellikler const ya da readonly olabilir.
- Yapılardaki özelliklere ilk değer verilemez.