Słowa kluczowe 'readonly' i 'const'
Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 16 z 70.
C# udostępnia dwa słowa kluczowe do tworzenia wartości, których nie można zmienić: const i readonly. Chociaż oba uniemożliwiają modyfikację, działają inaczej i służą różnym celom.
Pole const musi mieć przypisaną wartość podczas deklaracji, a jego wartość jest określana w czasie kompilacji. Jest niejawnie statyczne, co oznacza, że należy do klasy, a nie do jej instancji:
public class GameSettings
{
public const int MaxPlayers = 4;
public const double Gravity = 9.81;
}Dostęp do stałych uzyskujesz za pomocą nazwy klasy: GameSettings.MaxPlayers. Stałe działają tylko z typami prostymi, ciągami znaków i wartością null, ponieważ kompilator musi znać dokładną wartość.
Pole readonly można przypisać podczas deklaracji lub w konstruktorze, a jego wartość jest ustalana w czasie wykonywania:
public class Player
{
public readonly string Id;
public readonly DateTime CreatedAt = DateTime.Now;
public Player(string id)
{
Id = id;
}
}W przeciwieństwie do const, pola readonly mogą przechowywać dowolny typ i mogą mieć różne wartości dla poszczególnych instancji. Po zakończeniu konstruktora wartość nie może się zmienić.
Używaj const dla wartości, które są naprawdę uniwersalne i nigdy się nie zmienią, takich jak stałe matematyczne. Używaj readonly dla wartości, które powinny zostać ustawione tylko raz, ale mogą się różnić między obiektami lub wymagać obliczenia w czasie działania.
Wyzwanie
ŁatwyZbudujmy system konfiguracji symulacji fizycznej, który pokazuje, kiedy używać const dla stałych uniwersalnych, a kiedy readonly dla wartości ustawianych raz w czasie działania programu.
Utworzysz dwa pliki, aby uporządkować kod:
PhysicsConstants.cs: Zdefiniuj klasęPhysicsConstantsw przestrzeni nazwSimulation. Klasa ta powinna zawierać stałe uniwersalne, które nigdy się nie zmieniają i są takie same wszędzie:- Pole
constGravityo wartości9.81 - Pole
constSpeedOfLighto wartości299792458 - Stała tekstowa
constGravityUnito wartości"m/s^2"
- Pole
Projectile.cs: Zdefiniuj klasęProjectilew przestrzeni nazwSimulation. Każdy pocisk ma wartości, które należy ustawić przy jego tworzeniu i nigdy później ich nie modyfikować:- Pole
readonlyName(string) - Pole
readonlyInitialVelocity(double) - Pole
readonlyLaunchAngle(double, w stopniach) - Konstruktor, który przyjmuje i ustawia wszystkie trzy wartości
- Metodę
GetMaxHeight(), która oblicza maksymalną wysokość według wzoru:(velocity^2 * sin^2(angle)) / (2 * gravity). UżyjMath.Sin()i przelicz stopnie na radiany, mnożąc przezMath.PI / 180
- Pole
Program.cs: W głównym pliku utwórz pocisk, używając wartości wejściowych, i wyświetl stałe fizyczne wraz z obliczoną maksymalną wysokością pocisku.
Otrzymasz trzy dane wejściowe:
- Nazwę pocisku
- Prędkość początkową (w m/s)
- Kąt wystrzelenia (w stopniach)
Wyświetl wynik w tym formacie:
Gravity: {Gravity} {GravityUnit}
Speed of Light: {SpeedOfLight} m/s
Projectile: {Name}
Initial Velocity: {InitialVelocity} m/s
Launch Angle: {LaunchAngle} degrees
Max Height: {maxHeight} mZaokrąglij maksymalną wysokość do 2 miejsc po przecinku za pomocą Math.Round(value, 2).
Na przykład, jeśli dane wejściowe to Rocket, 50 i 45, wynik powinien być następujący:
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 mSpróbuj swoich sił
using System;
using Simulation;
class Program
{
public static void Main(string[] args)
{
// Odczytaj dane wejściowe
string name = Console.ReadLine();
double velocity = Convert.ToDouble(Console.ReadLine());
double angle = Convert.ToDouble(Console.ReadLine());
// TODO: Utwórz obiekt Projectile z podanymi wartościami
// TODO: Wypisz stałe fizyczne (Gravity wraz z jednostką, Speed of Light)
// TODO: Wypisz informacje o pocisku (Name, Initial Velocity, Launch Angle)
// TODO: Oblicz i wypisz maksymalną wysokość (zaokrągloną do 2 miejsc po przecinku)
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metodPoćwicz samodzielnie: Kompilator C# online