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 ayrı 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 tipler, 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'un aksine, readonly alanlar herhangi bir türü tutabilir ve örnek başına 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 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)
    • Her üç değeri de 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 dereceleri Math.PI / 180 ile çarparak radyana dönüştürün
  • Program.cs: Ana dosyanızda, girdi değerlerini kullanarak bir mermi 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 (Initial velocity - m/s cinsinden)
  • Fırlatma açısı (Launch angle - 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ı şöyle 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

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