Локальные константы (Local Constants)
Локальные константы во многом похожи на локальные переменные, но есть важное отличие: после инициализации значение константы изменять нельзя.
Как и локальные переменные, константы объявляются внутри блока кода.
У констант два ключевых свойства:
- При объявлении требуется обязательно задать начальное значение;
- После объявления изменять значение запрещено.
Базовый синтаксис констант
const Тип ИмяКонстанты = НачальноеЗначение;
// const: ключевое слово, пишется сразу перед типом данных
// = НачальноеЗначение: обязательная часть, пропускать нельзя
Code language: JavaScript (javascript)
Пояснение правил синтаксиса
По сравнению с обычным объявлением полей или переменных есть два различия:
- Перед типом данных добавляется ключевое слово
const; - Нужно указать начальное значение, и это значение должно быть определено на этапе компиляции:
- Чаще всего литералы базовых типов или выражения из базовых типов;
- Допускается присвоить значение
null; - Нельзя присваивать ссылки на экземпляры объектов (ссылки на объекты определяются во время выполнения, это не соответствует требованиям константы времени компиляции).
class Program
{
static void Main()
{
int a = 10; // это переменная
const int b = 20; // это константа, внешне похожа на переменную
// ключевое слово const указывает, что это константа
a = 100; // переменную можно перезаписывать
a = 200; // изменять можно сколько угодно раз
// Ошибка
b = 300; // константу изменить нельзя, компилятор выдаст ошибку
// Использование констант улучшает читаемость и поддерживаемость кода
int c; // объявление переменной
c = 12; // для переменной допустимо разделять объявление и присваивание
// Для констант разделять объявление и инициализацию запрещено
// Ошибка
const double d; // только объявление
d = 3.14; // работает для переменных, но не для констант
}
}Code language: C# (cs)

Эти две ошибки имеют разные причины: первая попытка изменить значение константы, вторая разделяет объявление и инициализацию. Для констант оба действия должны выполняться одновременно.
Можно ли использовать объект класса как константу?
Выражение, присваиваемое константе phone, должно быть константой времени компиляции.
new Phone() выделяет память в куче и создаёт объект во время работы программы, это значение времени выполнения.
В C# запрещено присваивать ссылки на объекты, созданные во время выполнения, локальным константам const. Это приводит к ошибке компиляции CS0133.
class Program
{
static void Main()
{
const Phone phone = new Phone();
}
}
class Phone
{
}Code language: C# (cs)

Дополнительное пояснение по ключевому слову
const не является модификатором, это неотъемлемая часть синтаксиса объявления, записывается напрямую перед типом данных.
Ключевые слова private, public, protected и другие относятся к модификаторам.
Правила области видимости и пример
Правила области видимости локальных констант полностью совпадают с правилами для локальных переменных: если константа объявлена внутри метода или блока кода, она перестаёт существовать после завершения работы этого блока.
void ShowArea()
{
const double PI = 3.1416; // объявляем локальную константу PI
for (int radius = 1; radius <= 5; radius++) // вывод площади кругов с радиусом от 1 до 5
{
double area = radius * radius * PI; // считываем значение константы PI
Console.WriteLine($"Радиус: {radius}, Площадь: {area}");
}
}
Code language: C# (cs)
Константа PI доступна только внутри метода ShowArea и удаляется после завершения его работы.
class Program
{
static void Main()
{
ShowArea();
}
static void ShowArea()
{
const double PI = 3.1416;
for (int radius = 1; radius <= 5; radius++)
{
double area = radius * radius * PI;
Console.WriteLine($"Radius: {radius}, Area: {area}");
}
}
}
Code language: C# (cs)

Локальные константы