Menu
Coddy logo textTech

Ключевые слова 'readonly' и 'const'

Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 16 из 70.

C# предоставляет два ключевых слова для создания значений, которые нельзя изменить: const и readonly. Хотя оба они предотвращают изменение, они работают по-разному и служат разным целям.

Поле const должно быть инициализировано при объявлении, и его значение определяется во время компиляции. Оно является неявно статическим, что означает, что оно принадлежит классу, а не экземплярам:

public class GameSettings
{
    public const int MaxPlayers = 4;
    public const double Gravity = 9.81;
}

Вы обращаетесь к константам через имя класса: GameSettings.MaxPlayers. Константы работают только с примитивными типами, строками и null, так как компилятор должен знать точное значение.

Поле readonly может быть инициализировано при объявлении или в конструкторе, а его значение определяется во время выполнения:

public class Player
{
    public readonly string Id;
    public readonly DateTime CreatedAt = DateTime.Now;
    
    public Player(string id)
    {
        Id = id;
    }
}

В отличие от const, поля readonly могут содержать любой тип и могут иметь разные значения для каждого экземпляра. Как только конструктор завершает работу, значение не может быть изменено.

Используйте const для значений, которые являются по-настоящему универсальными и никогда не изменятся, таких как математические константы. Используйте readonly для значений, которые должны быть установлены один раз, но могут различаться между объектами или требовать вычисления во время выполнения.

challenge icon

Задание

Легко

Давайте создадим систему конфигурации физической симуляции, которая демонстрирует, когда использовать const для универсальных констант, а когда — readonly для значений, которые устанавливаются один раз во время выполнения.

Вы создадите два файла для организации своего кода:

  • PhysicsConstants.cs: Определите класс PhysicsConstants в пространстве имен Simulation. Этот класс должен содержать универсальные константы, которые никогда не меняются и одинаковы везде:
    • Поле const с именем Gravity, установленное в 9.81
    • Поле const с именем SpeedOfLight, установленное в 299792458
    • Строковое поле const с именем GravityUnit, установленное в "m/s^2"
  • Projectile.cs: Определите класс Projectile в пространстве имен Simulation. Каждый снаряд имеет значения, которые должны быть установлены один раз при создании и никогда не изменяться впоследствии:
    • Поле readonly с именем Name (string)
    • Поле readonly с именем InitialVelocity (double)
    • Поле readonly с именем LaunchAngle (double, в градусах)
    • Конструктор, который принимает и устанавливает все три значения
    • Метод GetMaxHeight(), который вычисляет максимальную высоту по формуле: (velocity^2 * sin^2(angle)) / (2 * gravity). Используйте Math.Sin() и преобразуйте градусы в радианы, умножив на Math.PI / 180
  • Program.cs: В основном файле создайте объект снаряда, используя входные значения, и выведите физические константы вместе с рассчитанной максимальной высотой снаряда.

Вы получите три входных значения:

  • Название снаряда
  • Начальная скорость (в м/с)
  • Угол запуска (в градусах)

Выведите результат в следующем формате:

Gravity: {Gravity} {GravityUnit}
Speed of Light: {SpeedOfLight} m/s
Projectile: {Name}
Initial Velocity: {InitialVelocity} m/s
Launch Angle: {LaunchAngle} degrees
Max Height: {maxHeight} m

Округлите максимальную высоту до 2 знаков после запятой с помощью Math.Round(value, 2).

Например, если входные данные — Rocket, 50 и 45, результат должен быть:

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

Шпаргалка

C# предоставляет два ключевых слова для создания неизменяемых значений: const и readonly.

Поле const должно быть инициализировано при объявлении, его значение определяется во время компиляции, и оно является неявно статическим (static):

public class GameSettings
{
    public const int MaxPlayers = 4;
    public const double Gravity = 9.81;
}

Доступ к константам осуществляется через имя класса: GameSettings.MaxPlayers. Константы работают только с примитивными типами, строками и null.

Поле readonly может быть инициализировано при объявлении или в конструкторе, а его значение определяется во время выполнения:

public class Player
{
    public readonly string Id;
    public readonly DateTime CreatedAt = DateTime.Now;
    
    public Player(string id)
    {
        Id = id;
    }
}

Поля readonly могут хранить любой тип данных и могут иметь разные значения для каждого экземпляра. Как только конструктор завершает работу, значение изменить нельзя.

Используйте const для универсальных значений, которые никогда не изменятся. Используйте readonly для значений, которые должны быть установлены один раз, но могут различаться между объектами или требовать вычислений во время выполнения.

Попробуйте сами

using System;
using Simulation;

class Program
{
    public static void Main(string[] args)
    {
        // Чтение входных данных
        string name = Console.ReadLine();
        double velocity = Convert.ToDouble(Console.ReadLine());
        double angle = Convert.ToDouble(Console.ReadLine());

        // TODO: Создать объект Projectile с входными значениями

        // TODO: Вывести физические константы (Gravity с единицей измерения, Speed of Light)

        // TODO: Вывести информацию о снаряде (Name, Initial Velocity, Launch Angle)

        // TODO: Рассчитать и вывести максимальную высоту (округленную до 2 знаков после запятой)
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование