Константы и поля для чтения в C#

В объектно-ориентированном программировании на C# часто возникает необходимость хранить значения, которые не должны изменяться после инициализации. Для этого язык предоставляет два основных механизма: константы (const) и поля только для чтения (readonly).

Эти инструменты помогают создавать более безопасный и предсказуемый код, защищая важные данные от случайного изменения. В этой статье мы подробно разберём, как объявлять константы и поля для чтения в классах, в чём их различия, а также кратко рассмотрим структуры только для чтения.

 

Константы (const)

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

public class MathConstants

{

    public const double Pi = 3.141592653589793;

    public const int MaxUsers = 100;

    public const string AppName = "MyApplication";

}

Особенности констант:

  • Значение должно быть известно на этапе компиляции.
  • Константа автоматически является статической (нельзя использовать с экземпляром класса).
  • Нельзя изменить значение после объявления.
  • Подходят только для примитивных типов, строк и перечислений.

Использование:

Console.WriteLine(MathConstants.Pi);

Console.WriteLine(MathConstants.AppName);

 

Поля только для чтения (readonly)

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

public class User

{

    public readonly string Id;          // инициализация в конструкторе

    public readonly DateTime CreatedAt = DateTime.UtcNow; // инициализация при объявлении

 

    public User(string id)

    {

        Id = id;                        // разрешено только в конструкторе

    }

 

    public void ChangeId(string newId)

    {

        // Id = newId;                  // Ошибка! Поле только для чтения

    }

}

Ключевые отличия readonly от const:

Характеристика

const

readonly

Время определения значения

На этапе компиляции

На этапе выполнения (в конструкторе)

Можно ли инициализировать в конструкторе

Нет

Да

Можно ли использовать с объектами

Нет (только статические)

Да (как статические, так и экземплярные)

Поддерживаемые типы

Примитивы, строки, enum

Любые типы

 

Статические поля только для чтения

Часто readonly используют вместе со static, когда нужно создать значение, общее для всего класса, но вычисляемое во время выполнения:

public class Configuration

{

    public static readonly string ConfigPath;

 

    static Configuration()

    {

        ConfigPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.json");

    }

}

 

Структуры только для чтения (readonly struct)

Начиная с C# 7.2 можно объявлять структуры как readonly. Это гарантирует, что все члены структуры являются неизменяемыми, что повышает безопасность и производительность.

public readonly struct Point

{

    public readonly double X;

    public readonly double Y;

 

    public Point(double x, double y)

    {

        X = x;

        Y = y;

    }

 

    public double DistanceToOrigin() => Math.Sqrt(X * X + Y * Y);

}

Преимущества readonly struct:

  • Компилятор гарантирует, что структура не будет изменена.
  • Лучшая оптимизация при передаче в методы.
  • Повышение безопасности кода.

 

Константы и поля только для чтения — важные инструменты для создания надёжного и предсказуемого кода в C#.

Основные рекомендации:

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

Правильное использование этих механизмов помогает соблюдать принципы инкапсуляции и делает код более устойчивым к ошибкам. Это один из важных шагов к написанию качественного объектно-ориентированного кода на C#.

 

Лого

Spartacus_85 [Admin]

Администратор сайта — это специалист, который отвечает за техническую поддержку и бесперебойную работу веб-ресурса.



0 Комментарий(я)

Зарегистрируйтесь чтобы оставить комментарий