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.
Aufgabe
EinfachErstellen 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 einePhysicsConstants-Klasse im NamespaceSimulation. Diese Klasse soll universelle Konstanten enthalten, die sich nie ändern und überall gleich sind:- Ein
const-FeldGravitymit dem Wert9.81 - Ein
const-FeldSpeedOfLightmit dem Wert299792458 - Ein
const-StringGravityUnitmit dem Wert"m/s^2"
- Ein
Projectile.cs: Definiere eineProjectile-Klasse im NamespaceSimulation. Jedes Projektil besitzt Werte, die bei der Erstellung einmal festgelegt und danach nie mehr geändert werden sollen:- Ein
readonly-FeldName(String) - Ein
readonly-FeldInitialVelocity(double) - Ein
readonly-FeldLaunchAngle(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). VerwendeMath.Sin()und rechne Grad in Radiant um, indem du mitMath.PI / 180multiplizierst
- Ein
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} mRunde 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 mProbier 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)
}
}
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. EigenschaftenKonstruktorenObjektinitialisiererWiederholung – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbungs-(:)-SyntaxDas „base“-Schlüsselwort„virtual“- und „override“-SchlüsselwörterVersiegelte KlassenDie „object“-BasisklasseWiederholung – Mitarbeiterhierarchie7Erweiterte Funktionen
Überladen von OperatorenIndexer (this[])ToString()-ÜberschreibungErweiterungsmethodenRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterThread-sicheres SingletonFactory-MusterObserver-Muster (Events)Strategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformKomponente für SpielfigurenFahrzeugvermietungsdienst2Eigenschaften & statische Member
Automatisch implementierte EigenschaftenNur lesbare/schreibbare EigenschaftenStatische Felder & MethodenStatische KlassenMember mit Ausdruckskörpern5Polymorphie & Interfaces
Compile- vs. Laufzeit-PolymorphieInterface vs. abstrakte KlasseMehrere InterfacesExplizite InterfacesUpcasting & DowncastingWiederholung – Formenrechner3Klassenarchitektur
Instanz- vs. statische DatenSchlüsselwörter 'readonly' & 'const'Backing FieldsRückblick – Bankkontenverwaltung6Kapselung
ZugriffsmodifikatorenEigenschaften zur KapselungImplementierung der DatenkapselungMuster für UnveränderlichkeitRückblick – SchülerdatenÜbe selbstständig: Online-C#-Compiler