19 Mayıs 2015

C#'ta struct değişken türleri nedir?

   Struct yapı türleri yapı olarak değişkenleri içerisinde barındıran bir değer tipidir. Yani structın kendiside değişkendir ve int, string gibi değişkenleri kendi içerisinde kümeleyen bir yapıdır. Biraz class türünü anımsatsada aşağıdaki örneklerle bunu açıklayalım.

Önce bir konsol uygulaması açalım.
Burada
public struct Point { public int X, Y; }
türünde kendi içerisinde iki int değişkeni bulunduran bir değişkeniş tanımladık.

Şimdi Aşağıdaki Programı yazalım.

Point p1 = new Point();
p1.X = 7;
Point p2 = p1; // p2 burada p1 in bir kopyaso olarak üretilecek.
Console.WriteLine (p1.X); // 7
Console.WriteLine (p2.X); // 7
p1.X = 9; // Change p1.X
Console.WriteLine (p1.X); // 9
Console.WriteLine (p2.X); // 7
 Dikkat edersek burada p2 , p1 in bir kopyası olarak yeni bir değişken olarak üretilmiştir.Çünkü p1 de yapılan değişiklik p2 üzerinde herhangi bir değişikliğe sebep olmamıştır. 
Burada başlangıçta biri diğerinden kopyalanmış  ama daha sonrası için birbirinden bağımsız iki değişkenimiz var. Burada tanımlananda yaptığımız değişken artık diğerini değiştirmeyecektir.

!Dikkat:

Şimdi class yapısı ile yaptığımızda inceleyecek olursak.

public class Point { public int X, Y; }
 Programımızı yine aynı şekilde yazdığımıza ne olacağına bakalım.

Point p1 = new Point();
p1.X = 7;
Point p2 = p1; // Referans olarak alıyor
Console.WriteLine (p1.X); // 7
Console.WriteLine (p2.X); // 7
p1.X = 9; // Change p1.X
Console.WriteLine (p1.X); // 9
Console.WriteLine (p2.X); // 9

Burada dikkatimizi ilk çeken durum p1 de yapılan değişklik p2 yi de etkiledi. Çünkü class türü yapılarda değişkeni kopyalamaktan ziyede referans olarak alıyor. Yani p1 o class türünden üretilen yeni bir sınıf ama p2 de p1 in kendisini referans alan bir kopyası. Birinde yapılan bir değişiklik diğerini de etkileyecektir.

  Sonuç olarak class türü objeleri değişken olarak kullanmak istediğimizde çok dikkatli olmamız Çünkü dikattsizce yapılan bir işlem diğerinide değiştirdiği için istemeden de olsa sistemlerde de kararsızlık oluşmasına neden olabilir. Bu yüzden structure türünü kullanmak bizim için daha akıllıca olacakatır.

Kaynak :c# 5.0 in a Nutshell