C# Immutable Objects Kavramı

Elif BAYRAKDAR
2 min readMay 19, 2019

--

Merhabalar;

Immutable objects” aslında yazılımcılar tarafından her gün kullanılır, farkında olmasak da. Aynen Türkçe’ye çevirirsek de “değişmez nesneler” olarak karşılığını bulabiliriz.

Peki örneklere geçecek olursak, C#’ta hemen her gün bolca kullandığımız String class’ı ve de number types değişmez nesnelerdir. Örneğin String nesnesi yaratıldığında hafızada onun için yer ayrılır diğer nesneler gibi. Ancak yaratılan String nesnesinin değerini değiştirirsek(aslında biz değiştirdik sanıyoruz), bu yeni değer için hafızada yeni bir yer ayrılır. Her değiştirişte hafızada yeni bir yer ayırma işlemi devam eder. Bu sebepledir ki eğer bir String nesnesinin değerini çokça değiştirme ihtiyacı duyuyorsak performans bakımından daha iyi bir seçenek olan StringBuilder kullanırız. Çünkü kendisi immutable değildir. Bu durum teknik iş görüşmelerinde sıkça çıkan bir sorudur ama bu yazımızın konusu değil. :)

Bu kısmın daha iyi anlaşılabilmesi için stackowerflow’dan bir soru paylaşmak istiyorum. Bence işaretlenen cevaptan daha basit ve güzel anlatılamazdı:

https://stackoverflow.com/questions/3981827/why-are-c-sharp-number-types-immutable

Bizler de yapmak istediğimiz işlere bağlı olarak kendi immutable class’larımızı oluşturabiliriz. Hemen bir örnekle pekiştirmek istiyorum. Flower adında bir class’ımız olsun. İçerisinde de Color ve Smell isimli 2 property olsun.

public class Flower{    private readonly string color;    private readonly string smell;    
public string Color => color;
public string Smell => smell;
public Flower(string color, string smell){ this.color = color; this.smell = smell; }}

Bu class’ta property olan Color ve Smell property’leri class dışından ve class içinde değiştirilemez hale getirilmiştir, sadece bir değer döndürmekle yükümlüler. Yaptıkları iş ilgili field’ları döndürmek. Class dışında bir yerde yaratılan nesne için ya da class içindeki bir metodun içinde şu satırı yazsak readonly olduğuna dair hata verecektir:

this.Color = “pink”;

color ve smell field’ları ise private olduğu için class dışından ve readonly olduğu için class içinde değiştirilemez.

Bu kod parçasını şu şekilde daha sade bir hale getirebiliriz:

public class Flower{    public string Color { get; }    public string Shape { get; }    public Flower(string color, string shape){        Color = color;        Shape = shape;    }}

C# 6.0 ile gelen özelliğe göre property’ye setter koymazsak readonly sayıldığı için bu class da aslında ilki gibi immutable object yaratmamıza olanak tanıyacaktır.

Kısa ama başlangıç için fayda sağlayacak Türkçe içerikli bu yazımın sonuna geldim. Herkese kolay gelsin.

--

--

Elif BAYRAKDAR
Elif BAYRAKDAR

No responses yet