Menu
Coddy logo textTech

'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.

challenge icon

Görev

Kolay

Evrensel 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: Simulation ad alanında (namespace) bir PhysicsConstants sı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.81 değerine ayarlanmış bir const alan: Gravity
    • 299792458 değerine ayarlanmış bir const alan: SpeedOfLight
    • "m/s^2" değerine ayarlanmış bir const string alan: GravityUnit
  • Projectile.cs: Simulation ad alanında bir Projectile sı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 readonly alan: Name (string)
    • Bir readonly alan: InitialVelocity (double)
    • Bir readonly alan: 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 dereceyi Math.PI / 180 ile çarparak radyana dönüştürün.
  • 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} m

Maksimum 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 m

Kopya 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)
    }
}
quiz iconKendini test et

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