C#’ta Alanlar (Fields)

C#’ta alanlar, bir sınıf ya da bir sınıf örneği ile ilişkilendirilmiş değişkenlerdir. Static değiştiricisi ile tanımlanmış alanlar static field olarak tanımlanır. Static field’lar, tam olarak bir bellek yeri tanımlarlar. Kaç tane sınıf örneği oluşturulursa oluşturulsun, static field’ın sadece bir tane kopyası vardır.

Önemli: Static field’lar her generic type için ayrı bir yapısal yapıdır. Örneğin elinizde;

class Stack<T>
{
public readonly static Stack<T> bos = tralalalala;
}

varsa, Stack<int>.bos ve Stack<string>.bos alanları farklı alanlardır.

Static değiştiricisiz tanımlanmış alanlar birer örnek alanlardır. Her bir sınıf örneği, o sınıfın her bir örnek alanın kopyasını içerir.

Aşağıdaki örnekte; her bir Color sınıfının örneği, her bir r (red), g (green), b (blue) alanlarına sahiptir ama sadece bir adet kopya Siyah, Beyaz, Kırmızı, Yeşil ve Mavi static (durağan) alanlar mevcuttur.

public class Color
{

public static readonly Color Siyah = new Color(0, 0, 0);
public static readonly Color Beyaz = new Color(255, 255, 255);
public static readonly Color Kırmızı = new Color(255, 0, 0);
public static readonly Color Yeşil = new Color(0, 255, 0);
public static readonly Color Mavi = new Color(0, 0, 255);

private byte r, g, b;
public Color(byte r, byte g, byte b)
{
this.r = r;
this.g = g;
this.b = b;
}
}

Yukarıda görüldüğü gibi sadece okunabilir alanlar readonly değiştiricisi ile tanımlanmıştır. Bir readonly alana atama, sadece o alanın tanımlamasındaki bir kısmından ya da aynı sınıftaki bir yapıcı (constructor) sayesinde gerçekleşebilir.

Önemli: Readonly kelimesi dışarıdaki tip yapıcısı tarafından o alanın konumunun değiştirilmesini önler fakat o konumdaki değeri korumaz. Örneğin, aşağıdaki gibi İsimler şeklinde bir sınıfımız olsun;

public class İsimler
{
public static readonly StringBuilder İlkDogan = new StringBuilder("İlker");
public static readonly StringBuilder İkinciDogan = new StringBuilder("Soner");
}

Bir yapıcının dışından direkt olarak İlkdoğan örneğinin sonucunu değiştirmek bize bir derleyici hatası verecektir.

İsimler.İlkDogan = new StringBuilder("Caner"); // Derleyici Hatası

Ama, StringBuilder örneğini modifiye ederek aynı sonuca aşağıdaki şekilde ulaşabilirim;

İsimler.İlkDogan.Remove(0,6).Append("Caner");

Console.WriteLine(İsimler.İlkDogan); // Output “Caner” olur.

Bu yüzden, read-only kullanımı değişmez tipler için sınırlı kullanılmalıdır şeklinde tavsiye edilir. Değişmez tipler (Immutable types), int, double, string gibi açıkça setter’lara (belirleyiciler) sahip değildirler.