'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.
Aufgabe
EinfachLassen 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 KlassePhysicsConstantsim NamespaceSimulation. Diese Klasse sollte universelle Konstanten enthalten, die sich nie ändern und überall gleich sind:- Ein
const-FeldGravity, gesetzt auf9.81 - Ein
const-FeldSpeedOfLight, gesetzt auf299792458 - Ein
const-StringGravityUnit, gesetzt auf"m/s^2"
- Ein
Projectile.cs: Definieren Sie eine KlasseProjectileim NamespaceSimulation. Jedes Projektil hat Werte, die beim Erstellen einmal festgelegt und danach nie mehr geändert werden sollten:- Ein
readonly-FeldName(string) - Ein
readonly-FeldInitialVelocity(double) - Ein
readonly-FeldLaunchAngle(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 SieMath.Sin()und konvertieren Sie Grad in Bogenmaß (Radiant), indem Sie mitMath.PI / 180multiplizieren
- Ein
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} mRunden 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 mSpickzettel
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)
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten