- Sınıf ve nesne kavramlarını açıklamak ve
newile nesne oluşturmak - Verileri özellikler,
private set,initverequiredile korumak - Normal ve birincil (primary) yapıcılar yazmak
recordtürlerini vewithifadesini 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.
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!");
}
}Not enough money! Leyla: 70 AZN Elvin: 0 AZN
| Terim | Anlamı | Örnekte |
|---|---|---|
| Sınıf | nesnelerin planı | BankAccount |
| Nesne | sınıftan oluşturulmuş bir örnek | account, other |
| Özellik | okunması ve yazılması denetlenen nesne verisi | Balance |
| Metot | nesnenin yapabildiği bir iş | Deposit() |
| Yapıcı | nesne oluşturulurken çalışan özel metot | BankAccount(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.
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;
}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.
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";
}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.
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;
}Point { X = 3, Y = 4 }
Point { X = 3, Y = 10 }
True
FalseÖnemli noktalar
- Sınıf bir plandır; nesne ise
newile 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,initverequiredverileri korur; buna kapsülleme denir.- Sınıflar başvuru türleridir: iki değişken aynı nesneyi gösterebilir.
recorddeğiştirilemez veriler içindir: değere göre karşılaştırma, hazırToStringvewith.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
account.Withdraw(500) bakiyeyi neden değiştirmedi?