Menu
Coddy logo textTech

'readonly' & 'const' Schlüsselwörter

Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 16 von 70.

C# bietet zwei Schlüsselwörter zum Erstellen von Werten, die sich nicht ändern können: const und readonly. Obwohl beide eine Änderung verhindern, funktionieren sie unterschiedlich und dienen verschiedenen Zwecken.

Ein const-Feld muss bei der Deklaration zugewiesen werden, und sein Wert wird zur Kompilierzeit bestimmt. Es ist implizit statisch, was bedeutet, dass es zur Klasse gehört und nicht zu den Instanzen:

public class GameSettings
{
    public const int MaxPlayers = 4;
    public const double Gravity = 9.81;
}

Sie greifen über den Klassennamen auf Konstanten zu: GameSettings.MaxPlayers. Konstanten funktionieren nur mit primitiven Typen, Strings und null, da der Compiler den genauen Wert kennen muss.

Ein readonly-Feld kann bei der Deklaration oder in einem Konstruktor zugewiesen werden, und sein Wert wird zur Laufzeit bestimmt:

public class Player
{
    public readonly string Id;
    public readonly DateTime CreatedAt = DateTime.Now;
    
    public Player(string id)
    {
        Id = id;
    }
}

Im Gegensatz zu const können readonly-Felder jeden Typ enthalten und pro Instanz unterschiedliche Werte haben. Sobald der Konstruktor abgeschlossen ist, kann der Wert nicht mehr geändert werden.

Verwenden Sie const für Werte, die wirklich universell sind und sich nie ändern werden, wie mathematische Konstanten. Verwenden Sie readonly für Werte, die einmal gesetzt werden sollten, aber zwischen Objekten variieren können oder eine Berechnung zur Laufzeit erfordern.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Konfigurationssystem für eine Physiksimulation erstellen, das zeigt, wann const für universelle Konstanten und wann readonly für Werte verwendet wird, die einmal zur Laufzeit festgelegt werden.

Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:

  • PhysicsConstants.cs: Definieren Sie eine Klasse PhysicsConstants im Namespace Simulation. Diese Klasse sollte universelle Konstanten enthalten, die sich nie ändern und überall gleich sind:
    • Ein const-Feld Gravity, gesetzt auf 9.81
    • Ein const-Feld SpeedOfLight, gesetzt auf 299792458
    • Ein const-String GravityUnit, gesetzt auf "m/s^2"
  • Projectile.cs: Definieren Sie eine Klasse Projectile im Namespace Simulation. Jedes Projektil hat Werte, die beim Erstellen einmal festgelegt und danach nie mehr geändert werden sollten:
    • Ein readonly-Feld Name (string)
    • Ein readonly-Feld InitialVelocity (double)
    • Ein readonly-Feld LaunchAngle (double, in Grad)
    • Ein Konstruktor, der alle drei Werte entgegennimmt und setzt
    • Eine Methode GetMaxHeight(), die die maximale Höhe mit der Formel berechnet: (velocity^2 * sin^2(angle)) / (2 * gravity). Verwenden Sie Math.Sin() und konvertieren Sie Grad in Bogenmaß (Radiant), indem Sie mit Math.PI / 180 multiplizieren
  • Program.cs: Erstellen Sie in Ihrer Hauptdatei ein Projektil unter Verwendung von Eingabewerten und zeigen Sie die Physikkonstanten zusammen mit der berechneten maximalen Höhe des Projektils an.

Sie erhalten drei Eingaben:

  • Name des Projektils
  • Anfangsgeschwindigkeit (in m/s)
  • Abschusswinkel (in Grad)

Geben Sie die Ausgabe in diesem Format aus:

Gravity: {Gravity} {GravityUnit}
Speed of Light: {SpeedOfLight} m/s
Projectile: {Name}
Initial Velocity: {InitialVelocity} m/s
Launch Angle: {LaunchAngle} degrees
Max Height: {maxHeight} m

Runden Sie die maximale Höhe mit Math.Round(value, 2) auf 2 Dezimalstellen.

Wenn die Eingaben beispielsweise Rocket, 50 und 45 sind, sollte die Ausgabe wie folgt aussehen:

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

Spickzettel

C# bietet zwei Schlüsselwörter zum Erstellen unveränderlicher Werte: const und readonly.

Ein const-Feld muss bei der Deklaration zugewiesen werden, wird zur Kompilierzeit bestimmt und ist implizit statisch:

public class GameSettings
{
    public const int MaxPlayers = 4;
    public const double Gravity = 9.81;
}

Greifen Sie über den Klassennamen auf Konstanten zu: GameSettings.MaxPlayers. Konstanten funktionieren nur mit primitiven Typen, Strings und null.

Ein readonly-Feld kann bei der Deklaration oder in einem Konstruktor zugewiesen werden, und sein Wert wird zur Laufzeit bestimmt:

public class Player
{
    public readonly string Id;
    public readonly DateTime CreatedAt = DateTime.Now;
    
    public Player(string id)
    {
        Id = id;
    }
}

readonly-Felder können jeden Typ enthalten und pro Instanz unterschiedliche Werte haben. Sobald der Konstruktor abgeschlossen ist, kann der Wert nicht mehr geändert werden.

Verwenden Sie const für universelle Werte, die sich nie ändern werden. Verwenden Sie readonly für Werte, die einmal festgelegt werden sollen, aber zwischen Objekten variieren können oder eine Berechnung zur Laufzeit erfordern.

Probier es selbst

using System;
using Simulation;

class Program
{
    public static void Main(string[] args)
    {
        // Eingaben lesen
        string name = Console.ReadLine();
        double velocity = Convert.ToDouble(Console.ReadLine());
        double angle = Convert.ToDouble(Console.ReadLine());

        // TODO: Erstelle ein Projectile-Objekt mit den Eingabewerten

        // TODO: Gib die physikalischen Konstanten aus (Gravity mit Einheit, Speed of Light)

        // TODO: Gib die Projektilinformationen aus (Name, Initial Velocity, Launch Angle)

        // TODO: Berechne und gib die maximale Höhe aus (gerundet auf 2 Dezimalstellen)
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung