Menu
Coddy logo textTech

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

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 eher zur Klasse als zu den Instanzen gehört:

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 einmalig gesetzt werden sollten, aber zwischen Objekten variieren können oder eine Berechnung zur Laufzeit erfordern.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Physiksimulations-Konfigurationssystem, das veranschaulicht, wann const für universelle Konstanten und wann readonly für Werte verwendet wird, die einmal zur Laufzeit festgelegt werden.

Du erstellst zwei Dateien, um deinen Code zu organisieren:

  • PhysicsConstants.cs: Definiere eine PhysicsConstants-Klasse im Namespace Simulation. Diese Klasse soll universelle Konstanten enthalten, die sich nie ändern und überall gleich sind:
    • Ein const-Feld Gravity mit dem Wert 9.81
    • Ein const-Feld SpeedOfLight mit dem Wert 299792458
    • Ein const-String GravityUnit mit dem Wert "m/s^2"
  • Projectile.cs: Definiere eine Projectile-Klasse im Namespace Simulation. Jedes Projektil besitzt Werte, die bei der Erstellung einmal festgelegt und danach nie mehr geändert werden sollen:
    • Ein readonly-Feld Name (String)
    • Ein readonly-Feld InitialVelocity (double)
    • Ein readonly-Feld LaunchAngle (double, in Grad)
    • Einen Konstruktor, der alle drei Werte entgegennimmt und festlegt
    • Eine Methode GetMaxHeight(), die die maximale Höhe mithilfe der Formel berechnet: (velocity^2 * sin^2(angle)) / (2 * gravity). Verwende Math.Sin() und rechne Grad in Radiant um, indem du mit Math.PI / 180 multiplizierst
  • Program.cs: Erstelle in deiner Hauptdatei ein Projektil mithilfe von Eingabewerten und gib die Physikkonstanten zusammen mit der berechneten maximalen Höhe des Projektils aus.

Du erhältst drei Eingaben:

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

Gib 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

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

Wenn die Eingaben beispielsweise Rocket, 50 und 45 lauten, 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

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 (Schwerkraft mit Einheit, Lichtgeschwindigkeit)

        // TODO: Gib die Projektilinformationen aus (Name, Anfangsgeschwindigkeit, Abschusswinkel)

        // 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

Übe selbstständig: Online-C#-Compiler