'readonly' ve 'const' Anahtar Kelimeleri
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 16 / 70.
C# değiştirilemeyen değerler oluşturmak için iki anahtar kelime sunar: const ve readonly. Her ikisi de değişikliği engellese de, farklı şekilde çalışırlar ve farklı amaçlara hizmet ederler.
Bir const alanı bildirim sırasında atanmalıdır ve değeri derleme zamanında belirlenir. Örtük olarak statiktir, yani örneklere değil sınıfa aittir:
public class GameSettings
{
public const int MaxPlayers = 4;
public const double Gravity = 9.81;
}Sabitlere sınıf adı üzerinden erişirsiniz: GameSettings.MaxPlayers. Sabitler yalnızca ilkel türler, dizeler ve null ile çalışır çünkü derleyicinin tam değeri bilmesi gerekir.
Bir readonly alan, bildirim sırasında veya bir yapıcıda (constructor) atanabilir ve değeri çalışma zamanında (runtime) belirlenir:
public class Player
{
public readonly string Id;
public readonly DateTime CreatedAt = DateTime.Now;
public Player(string id)
{
Id = id;
}
}const ifadesinin aksine, readonly alanları herhangi bir türü tutabilir ve her örnek için farklı değerlere sahip olabilir. Constructor tamamlandığında, değer değiştirilemez.
Matematiksel sabitler gibi gerçekten evrensel olan ve asla değişmeyecek değerler için const kullanın. Bir kez ayarlanması gereken ancak nesneler arasında farklılık gösterebilen veya çalışma zamanı hesaplaması gerektiren değerler için readonly kullanın.
Görev
KolayEvrensel sabitler için const kullanımının, çalışma zamanında bir kez ayarlanan değerler için ise readonly kullanımının ne zaman tercih edileceğini gösteren bir fizik simülasyonu yapılandırma sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
PhysicsConstants.cs:Simulationad alanında (namespace) birPhysicsConstantssınıfı tanımlayın. Bu sınıf, hiçbir zaman değişmeyen ve her yerde aynı olan evrensel sabitleri içermelidir:9.81değerine ayarlanmış birconstalan:Gravity299792458değerine ayarlanmış birconstalan:SpeedOfLight"m/s^2"değerine ayarlanmış birconststring alan:GravityUnit
Projectile.cs:Simulationad alanında birProjectilesınıfı tanımlayın. Her merminin (projectile), oluşturulduğunda bir kez ayarlanması ve sonrasında asla değiştirilmemesi gereken değerleri vardır:- Bir
readonlyalan:Name(string) - Bir
readonlyalan:InitialVelocity(double) - Bir
readonlyalan:LaunchAngle(double, derece cinsinden) - Bu üç değerin tamamını kabul eden ve atayan bir yapıcı metot (constructor)
- Şu formülü kullanarak maksimum yüksekliği hesaplayan bir
GetMaxHeight()metodu:(velocity^2 * sin^2(angle)) / (2 * gravity).Math.Sin()kullanın ve dereceyiMath.PI / 180ile çarparak radyana dönüştürün.
- Bir
Program.cs: Ana dosyanızda, girdi değerlerini kullanarak bir mermi nesnesi oluşturun ve fizik sabitlerini merminin hesaplanan maksimum yüksekliğiyle birlikte görüntüleyin.
Üç girdi alacaksınız:
- Mermi adı (Projectile name)
- İlk hız (m/s cinsinden)
- Fırlatma açısı (derece cinsinden)
Çıktıyı şu formatta yazdırın:
Gravity: {Gravity} {GravityUnit}
Speed of Light: {SpeedOfLight} m/s
Projectile: {Name}
Initial Velocity: {InitialVelocity} m/s
Launch Angle: {LaunchAngle} degrees
Max Height: {maxHeight} mMaksimum yüksekliği Math.Round(value, 2) kullanarak 2 ondalık basamağa yuvarlayın.
Örneğin, girdiler Rocket, 50 ve 45 ise çıktı şu şekilde olmalıdır:
Gravity: 9.81 m/s^2
Speed of Light: 299792458 m/s
Projectile: Rocket
Initial Velocity: 50 m/s
Launch Angle: 45 degrees
Max Height: 63.71 mKopya kağıdı
C#, değişmez değerler oluşturmak için iki anahtar kelime sunar: const ve readonly.
Bir const alanı bildirim sırasında atanmalıdır, derleme zamanında belirlenir ve örtük olarak statiktir:
public class GameSettings
{
public const int MaxPlayers = 4;
public const double Gravity = 9.81;
}Sabitlere sınıf adı üzerinden erişin: GameSettings.MaxPlayers. Sabitler yalnızca ilkel türler, dizeler (strings) ve null ile çalışır.
Bir readonly alanı bildirim sırasında veya bir yapıcı metot (constructor) içinde atanabilir ve değeri çalışma zamanında belirlenir:
public class Player
{
public readonly string Id;
public readonly DateTime CreatedAt = DateTime.Now;
public Player(string id)
{
Id = id;
}
}readonly alanları herhangi bir türü tutabilir ve her örnek (instance) için farklı değerlere sahip olabilir. Yapıcı metot tamamlandıktan sonra değer değiştirilemez.
Hiçbir zaman değişmeyecek evrensel değerler için const kullanın. Bir kez ayarlanması gereken ancak nesneler arasında farklılık gösterebilen veya çalışma zamanı hesaplaması gerektiren değerler için readonly kullanın.
Kendin dene
using System;
using Simulation;
class Program
{
public static void Main(string[] args)
{
// Girdileri oku
string name = Console.ReadLine();
double velocity = Convert.ToDouble(Console.ReadLine());
double angle = Convert.ToDouble(Console.ReadLine());
// TODO: Giriş değerleri ile bir Projectile nesnesi oluşturun
// TODO: Fizik sabitlerini yazdırın (birimiyle birlikte Gravity, Speed of Light)
// TODO: Mermi bilgilerini yazdırın (Name, Initial Velocity, Launch Angle)
// TODO: Maksimum yüksekliği hesaplayın ve yazdırın (ondalık kısmı 2 basamağa yuvarlanmış şekilde)
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları