0Pricing
C# Academy · Ders

init ve with ile Değişmezlik

Değişmez nesneler oluşturmak için yalnızca init ayarlayıcılarını, yapıyı bozmadan değiştirilmiş kopyalar üretmek için with ifadelerini kullanın.

init ve with ile Değişmezlik, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.

Değişmezlik Nedir?

Değişmez bir nesne oluşturulduktan sonra değiştirilemez. Değişmezlik, yanlışlıkla yapılan değişiklikleri önler, nesneleri varsayılan olarak iş parçacığı güvenli kılar ve kodun mantığını kavramayı kolaylaştırır. C#, değişmezliği pratik hâle getirmek için init ayarlayıcıları ve with ifadeleri sunar.

Yalnızca init ile Ayarlanan Özellikler

init erişimcisi, bir özelliğin nesne başlatılırken (oluşturucuda veya nesne başlatıcıda) ayarlanmasına izin verir, ancak sonrasında ayarlanmasına izin vermez. set erişimcisinin değişmez karşılığıdır.

public class Point
{
    public double X { get; init; }
    public double Y { get; init; }
}

var p = new Point { X = 3.0, Y = 4.0 }; // OK — init phase
p.X = 5.0; // COMPILE ERROR — cannot set after init

// All of these are valid init-phase assignments:
var p2 = new Point(X: 1.0, Y: 2.0);
var p3 = new Point { X = 0, Y = 0 };

Kayıtların Konumsal Özelliklerinde init

Konumsal kayıt özellikleri varsayılan olarak yalnızca init ile ayarlanabilir; kayıtları değişmez kılan da budur. Derleyici, her konumsal parametre için get; init; oluşturur.

// This record:
public record Person(string Name, int Age);

// Is equivalent to:
public record Person
{
    public string Name { get; init; }
    public int Age    { get; init; }
    public Person(string Name, int Age) { this.Name = Name; this.Age = Age; }
    // + Deconstruct, Equals, GetHashCode, ToString
}

var alice = new Person("Alice", 30);
alice.Name = "Bob"; // COMPILE ERROR

with İfadeleri: Yıkıcı Olmayan Değişiklik

Bir with ifadesi, belirli özellikleri değiştirilmiş bir kaydın kopyasını oluşturur. Özgün kayıt değişmez; gerçek değişmezlik budur.

public record Person(string Name, int Age, string Email);

var alice = new Person("Alice", 30, "alice@example.com");

// Create a modified copy — alice is unchanged
var olderAlice = alice with { Age = 31 };
var renamed    = alice with { Name = "Alicia", Email = "alicia@example.com" };

Console.WriteLine(alice.Name);      // Alice (unchanged)
Console.WriteLine(olderAlice.Age);  // 31
Console.WriteLine(renamed.Name);    // Alicia

Kayıt Olmayan Türlerde with

C# 10, kopya oluşturucu anlambilimine sahip tüm yapı veya sınıflarda with kullanımına izin verir; ancak bu kullanım kayıtlarla daha doğaldır. Sınıflar için bunu elle uygulamanız gerekir.

// struct with with-expression:
public struct Temperature
{
    public double Celsius { get; init; }
    public double Fahrenheit => Celsius * 9 / 5 + 32;
}

var t1 = new Temperature { Celsius = 20 };
var t2 = t1 with { Celsius = 25 }; // copy with change
Console.WriteLine(t1.Celsius); // 20 — unchanged
Console.WriteLine(t2.Celsius); // 25

with İfadelerini Zincirleme

Karmaşık dönüşümler oluşturmak için birden çok with ifadesini zincirleyin; her adım, bir önceki adımdan yeni bir değişmez değer oluşturur.

public record Order(int Id, string Status, decimal Total, DateTime UpdatedAt);

var order = new Order(42, "Pending", 99.99m, DateTime.UtcNow);

// Apply a promotion discount then mark as confirmed
var finalOrder = order
    with { Total    = order.Total * 0.9m }    // 10% off
    with { Status   = "Confirmed" }
    with { UpdatedAt = DateTime.UtcNow };

Console.WriteLine(order.Status);     // Pending (original unchanged)
Console.WriteLine(finalOrder.Status); // Confirmed

Değişmez Türlerde Hesaplanan Özellikler

Değişmez türlerdeki türetilmiş özellikler doğal olarak saftır; sabit özellik değerlerinden hesaplanır ve aynı girdi için her zaman aynı sonucu döndürür.

public record Money(decimal Amount, string Currency)
{
    public Money Add(Money other)
    {
        if (Currency != other.Currency)
            throw new InvalidOperationException("Currency mismatch");
        return this with { Amount = Amount + other.Amount };
    }

    public Money Multiply(decimal factor) =>
        this with { Amount = Amount * factor };

    public override string ToString() =>
        $"{Amount:F2} {Currency}";
}

var price = new Money(10.00m, "USD");
var tax   = price.Multiply(0.08m);
var total = price.Add(tax);
Console.WriteLine(total); // 10.80 USD

Değişmez Koleksiyonlar

Tamamen değişmez veri yapıları oluşturmak için kayıtları ImmutableList<T> ve System.Collections.Immutable içindeki diğer türlerle birleştirin.

using System.Collections.Immutable;

public record ShoppingCart(
    string UserId,
    ImmutableList<CartItem> Items)
{
    public ShoppingCart AddItem(CartItem item) =>
        this with { Items = Items.Add(item) };

    public ShoppingCart RemoveItem(int productId) =>
        this with { Items = Items.RemoveAll(i => i.ProductId == productId) };

    public decimal Total => Items.Sum(i => i.Price * i.Quantity);
}

Değişmezlikten Gelen İş Parçacığı Güvenliği

Değişmez nesneler doğaları gereği iş parçacığı açısından güvenlidir; durumları oluşturulduktan sonra değişemediği için iş parçacıkları arasında paylaşılırken eşzamanlama gerekmez.

// Immutable config record shared across all threads safely
public record AppConfig(
    string ConnectionString,
    int MaxRetries,
    TimeSpan Timeout);

// Register as singleton — safe because record is immutable
builder.Services.AddSingleton(
    new AppConfig(
        ConnectionString: config["DB"]!,
        MaxRetries: 3,
        Timeout: TimeSpan.FromSeconds(30)));

// Any thread can read this simultaneously without locks

Gerçek Dünya: İşlevsel Olay Kaynaklama

Değişmez kayıtlar olay kaynaklamayla doğal biçimde eşleşir: her alan olayı değişmezdir ve durum, olayların katlanmasıyla türetilir; değişiklik yoktur, sürpriz yoktur.

public record OrderState(
    int Id,
    string Status = "Draft",
    decimal Total = 0m);

public static OrderState Apply(OrderState state, object evt) => evt switch
{
    OrderPlaced   e => state with { Status = "Pending", Total = e.Total },
    OrderShipped  _ => state with { Status = "Shipped" },
    OrderCancelled _ => state with { Status = "Cancelled" },
    _ => state
};

// Fold events to get current state:
var state = events.Aggregate(
    new OrderState(id),
    Apply);

Hızlı Denetim

'with' ifadesi özgün kayıt üzerinde ne yapar?

Özet: init ve with ile Değişmezlik

Önemli noktalar:

  • init erişimcisi: yalnızca başlatma sırasında ayarlanabilir, sonrasında ayarlanamaz
  • Kayıtların konumsal özellikleri varsayılan olarak yalnızca init ile ayarlanabilir
  • with ifadesi: değiştirilmiş bir kopya oluşturur; özgün kayıt değişmez
  • Çok adımlı dönüşümler için with ifadelerini zincirleyin
  • Değişmez türler, eşzamanlama olmadan iş parçacığı açısından güvenlidir
  • Tamamen değişmez nesne grafikleri için ImmutableList<T> ile birleştirin

Sıkça Sorulan Sorular

“init ve with ile Değişmezlik” dersi ücretsiz mi?

Evet — “init ve with ile Değişmezlik” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.

“init ve with ile Değişmezlik” dersinde ne öğreneceğim?

Değişmez nesneler oluşturmak için yalnızca init ayarlayıcılarını, yapıyı bozmadan değiştirilmiş kopyalar üretmek için with ifadelerini kullanın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“init ve with ile Değişmezlik” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Record Türleri: Temeller ve Sözdizimi
  2. init ve with ile Değişmezlik
  3. Değer Eşitliği ve Yapıdan Çıkarma
  4. Alan Odaklı Tasarımda Record'lar
← C# Academy Sayfasına Dön