Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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ę PhysicsConstants w przestrzeni nazw Simulation. Klasa ta powinna zawierać stałe uniwersalne, które nigdy się nie zmieniają i są takie same wszędzie:
    • Pole const Gravity o wartości 9.81
    • Pole const SpeedOfLight o wartości 299792458
    • Stała tekstowa const GravityUnit o wartości "m/s^2"
  • Projectile.cs: Zdefiniuj klasę Projectile w przestrzeni nazw Simulation. Każdy pocisk ma wartości, które należy ustawić przy jego tworzeniu i nigdy później ich nie modyfikować:
    • Pole readonly Name (string)
    • Pole readonly InitialVelocity (double)
    • Pole readonly LaunchAngle (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żyj Math.Sin() i przelicz stopnie na radiany, mnożąc przez Math.PI / 180
  • 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} m

Zaokrą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 m

Spró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)
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C# online