İçeriğe geç
Educora
Orta20 dk6 / 16

Sınıflar, özellikler, yapıcılar ve record'lar

Verileri ve davranışı bir araya getir: sınıflar, nesneler, özellikler, yapıcılar, birincil yapıcılar ve record türleri.

Kendini test et
Bu derste öğreneceklerin
  • Sınıf ve nesne kavramlarını açıklamak ve new ile nesne oluşturmak
  • Verileri özellikler, private set, init ve required ile korumak
  • Normal ve birincil (primary) yapıcılar yazmak
  • record türlerini ve with ifadesini kullanmak

Bir bankacılık uygulaması yazıyorsun: her hesabın bir sahibi ve bakiyesi var, para yatırılıp çekilebiliyor ve bakiye asla eksiye düşmemeli. Binlerce hesap için ayrı ayrı değişkenler ve metotlar kısa sürede karmaşaya dönüşür. C# nesne yönelimli bir dildir: veriler ve onlarla çalışan metotlar bir sınıfta birleştirilir, sonra bu sınıftan istediğin kadar nesne oluşturulur.

Sınıf ve nesne

Sınıf, nesnelerin planıdır: her nesnenin hangi verilere sahip olacağını ve neler yapabileceğini tanımlar. Nesne, bu plana göre new anahtar sözcüğüyle oluşturulan somut bir örnektir. Üst düzey deyimler kullanan bir dosyada sınıflar, deyimlerden sonra, dosyanın sonuna yazılır.

C#
var account = new BankAccount("Leyla");
account.Deposit(100);
account.Withdraw(30);
account.Withdraw(500);
Console.WriteLine($"{account.Owner}: {account.Balance} AZN");
var other = new BankAccount("Elvin");
Console.WriteLine($"{other.Owner}: {other.Balance} AZN");

class BankAccount
{
    public string Owner { get; }
    public decimal Balance { get; private set; }

    public BankAccount(string owner)
    {
        Owner = owner;
    }

    public void Deposit(decimal amount) => Balance += amount;
    public void Withdraw(decimal amount)
    {
        if (amount <= Balance) Balance -= amount;
        else Console.WriteLine("Not enough money!");
    }
}
Beklenen çıktı
Not enough money!
Leyla: 70 AZN
Elvin: 0 AZN
TerimAnlamıÖrnekte
Sınıfnesnelerin planıBankAccount
Nesnesınıftan oluşturulmuş bir örnekaccount, other
Özellikokunması ve yazılması denetlenen nesne verisiBalance
Metotnesnenin yapabildiği bir işDeposit()
Yapıcınesne oluşturulurken çalışan özel metotBankAccount(string owner)

Yapıcının adı sınıfın adıyla aynıdır ve dönüş türü yoktur. new BankAccount("Leyla") yazdığında nesne oluşturulur ve yapıcı hemen çağrılır. account ve other aynı sınıftan oluşturuldu ama her birinin kendi bakiyesi var; nesneler birbirinden bağımsızdır.

Özellikler ve kapsülleme

public bir üye her yerden görülebilir, private bir üyeye ise yalnızca sınıfın içinden erişilebilir. Balance { get; private set; } özelliği dışarıdan okunabilir ama yalnızca sınıfın kendi metotları onu değiştirebilir. account.Balance = 1000000; yazarsan derleyici CS0272 hatası verir. Verilerin bu şekilde korunmasına kapsülleme denir: bakiye yalnızca Deposit ve Withdraw kurallarıyla değişir.

Bir nesne nesne başlatıcısıyla da oluşturulabilir: özelliklere süslü parantez içinde değer verilir. init, bir özelliğe yalnızca nesne oluşturulurken değer verilmesine izin verir; required ise o özelliğin mutlaka doldurulmasını şart koşar. Gövdesi => ile yazılan bir özellik hesaplanan bir özelliktir: değeri her seferinde yeniden hesaplanır.

C#
var phone = new Product { Name = "Phone", Price = 450m, Stock = 3 };
var cable = new Product { Name = "Cable", Price = 12m };

Console.WriteLine($"{phone.Name}: {phone.TotalValue} AZN, in stock: {phone.InStock}");
Console.WriteLine($"{cable.Name}: {cable.TotalValue} AZN, in stock: {cable.InStock}");

phone.Stock--;
Console.WriteLine($"{phone.Name} left: {phone.Stock}");

class Product
{
    public required string Name { get; init; }
    public decimal Price { get; init; }
    public int Stock { get; set; }

    public decimal TotalValue => Price * Stock;
    public bool InStock => Stock > 0;
}
Beklenen çıktı
Phone: 1350 AZN, in stock: True
Cable: 0 AZN, in stock: False
Phone left: 2
Name vermeden new Product { Price = 5m } yazarsan CS9035 hatası alırsın.

Birincil yapıcılar

C# 12'den itibaren yapıcının parametreleri doğrudan sınıf adından sonra yazılabilir; buna birincil yapıcı (primary constructor) denir. Parametreler sınıfın tüm üyelerinde görünür ve ayrı bir yapıcı yazmaya gerek kalmaz. Aşağıdaki örnekte ToString metodu nesnenin metin hâlini belirler: Console.WriteLine(hero) tam olarak onu çağırır. override sözcüğünü bir sonraki derste ayrıntılı öğreneceksin.

C#
var hero = new Player("Aysel");
hero.GainXp(250);
Console.WriteLine(hero);
hero.GainXp(80);
Console.WriteLine(hero);

class Player(string name)
{
    public int Level { get; private set; } = 1;
    public int Xp { get; private set; }

    public void GainXp(int amount)
    {
        Xp += amount;
        Level = 1 + Xp / 100;
    }

    public override string ToString() => $"{name}: level {Level}, {Xp} XP";
}
Beklenen çıktı
Aysel: level 3, 250 XP
Aysel: level 4, 330 XP

Record: veri için türler

Bazen bir nesne yalnızca veri taşır: bir noktanın koordinatları, bir siparişin tarihi ve tutarı gibi. Böyle durumlar için C#'ta record vardır. record Point(int X, int Y); tek satırda özellikleri, bir yapıcıyı, okunaklı bir ToString'i ve değere göre karşılaştırmayı oluşturur. Bir record'un özellikleri değiştirilemez ama with ifadesiyle bazı özellikleri farklı olan yeni bir kopya oluşturulabilir.

C#
var p1 = new Point(3, 4);
var p2 = new Point(3, 4);
var p3 = p1 with { Y = 10 };

Console.WriteLine(p1);
Console.WriteLine(p3);
Console.WriteLine(p1 == p2);

var c1 = new PointClass(3, 4);
var c2 = new PointClass(3, 4);
Console.WriteLine(c1 == c2);

record Point(int X, int Y);

class PointClass(int x, int y)
{
    public int X => x;
    public int Y => y;
}
Beklenen çıktı
Point { X = 3, Y = 4 }
Point { X = 3, Y = 10 }
True
False
Aynı değerlere sahip iki record eşittir; iki sıradan nesne ise yalnızca aynı nesneyse eşittir.

Önemli noktalar

  • Sınıf bir plandır; nesne ise new ile oluşturulan somut bir örnektir.
  • Yapıcı, nesne oluşturulurken çalışır; birincil yapıcının parametreleri sınıf adından sonra yazılır.
  • private set, init ve required verileri korur; buna kapsülleme denir.
  • Sınıflar başvuru türleridir: iki değişken aynı nesneyi gösterebilir.
  • record değiştirilemez veriler içindir: değere göre karşılaştırma, hazır ToString ve with.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Banka örneğinde account.Withdraw(500) bakiyeyi neden değiştirmedi?