Полное руководство по языку программирования С# 14 и платформе .NET 10 / Классы, структуры и пространства имен

Константы, поля и структуры для чтения

Начальный ⏱ 3 мин чтения 👁 2 🕓 обновлено 11.08.2026

Константы классы

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


Person tom = new Person();
tom.name = "Tom";
tom.Print();    // Person: Tom

Console.WriteLine(Person.type); // Person
// Person.type = "User"; 	// !Ошибка: изменить константу нельзя

class Person
{
    public const string type = "Person";
    public string name = "Undefined";
    public void Print() => Console.WriteLine($"{type}: {name}");
}

Здесь в классе Person определена константа type, которая хранит название класса:

public const string type = "Person";

Название класса не зависит от объекта. Мы можем создать много объектов Person, но название класса от этого не должно измениться - оно относится ко всем объектам Person и не должно меняться. Поэтому название типа можно сохранить в виде константы.

Стоит отметить, что константе сразу при ее определении необходимо присвоить значение.

Подобно обычным полям мы можем обращаться к константам класса внутри этого класса. Например, в методе Print значение константы выводится на консоль.

Однако если мы хотим обратиться к константе вне ее класса, то для обращения необходимо использовались имя класса:

Console.WriteLine(Person.type); // Person

Таким образом, если необходимо хранить данные, которые относятся ко всему классу в целом, то можно использовать константы.

Поля для чтения и модификатор readonly

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

Поле для чтения объявляется с ключевым словом readonly:


Person tom = new Person("Tom");
Console.WriteLine(tom.name);

//tom.name = "Sam"; // !Ошибка: нельзя изменить
class Person
{
    public readonly string name = "Undefined"; // можно так инициализировать
    public Person(string name)
    {
        this.name = name; // в конструкторе также можно присвоить значение полю для чтения
    }
    public void ChangeName(string otherName)
    {
        //this.name = otherName;    // так нельзя 
    }
}

Здесь поле name хранит имя пользователя и представляет поле для чтения. Ему можно присвоить значение непосредственно при объявлении:

public readonly string name = "Undefined";

Либо можно присвоить значение в конструкторе


public Person(string name)
{
	this.name = name;
}

В остальных местах программы, в том числе в самом классе Person присвоить значение полю для чтения нельзя.

Сравнение констант

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

    Соответственно значение константы можно установить только при ее определении.

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

  • Константы не могут использовать модификатор static, так как уже неявно являются статическими. Поля для чтения могут быть как статическими, так и не статическими.

Структуры для чтения

Кроме полей для чтения в C# можно определять структуры для чтения. Для этого они предваряются модификатором readonly:


readonly struct Person { }

Особенностью таких структур является то, что все их поля должны быть также полями для чтения:


readonly struct Person
{
	public readonly string name;
	public Person(string name)
	{
		this.name = name;
	}
}

То же самое касается и свойств, которые должны быть доступны только для чтения:


readonly struct Person
{
	public readonly string Name { get; } // указывать readonly необязательно
	public int Age { get; } // свойство только для чтения
	public Person(string name, int age)
	{
		Name = name;
		Age = age;
	}
}
Дополнительные материалы

Проверь себя

📋 Тест по теме «Константы, поля и структуры для чтения» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____ tom = new Person();
tom.name = "Tom";
tom.Print();    // Person: Tom

Console.WriteLine(Person.type); // Person
// Person.type = "User"; 	// !Ошибка: изменить константу нельзя

class Person
{
    public const string type = "Person";
    public string name = "Undefined";
    public void Print() => Console.WriteLine($"{type}: {name}");
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

public const string _____ = "Person";
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Console.WriteLine(_____.type); // Person
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____ tom = new Person("Tom");
Console.WriteLine(tom.name);

//tom.name = "Sam"; // !Ошибка: нельзя изменить
class Person
{
    public readonly string name = "Undefined"; // можно так инициализировать
    public Person(string name)
    {
        this.name = name; // в конструкторе также можно присвоить значение полю для чтения
    }
    public void ChangeName(string otherName)
    {
        //this.name = otherName;    // так нельзя 
    }
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

public readonly string _____ = "Undefined";
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

Person tom = new Person();
tom.name = "Tom";
tom.Print();    // Person: Tom

_____.WriteLine(Person.type); // Person
// Person.type = "_____"; 	// !Ошибка: изменить константу нельзя

class Person
{
    public const string type = "Person";
    public string name = "Undefined";
    public void Print() => Console.WriteLine($"{type}: {name}");
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

public _____ string _____ = "Person";
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

{
}
	this.name = name;
public Person(string name)
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Константы, поля и структуры для чтения»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Константы, поля и структуры для чтения», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

Person tom = new Person();
tom.name = "Tom";
tom.Print();    // Person: Tom

Console.WriteLine(Person.type); // Person
// Person.type = "User"; 	// !Ошибка: изменить константу нельзя

class Person
{
    public const string type = "Person";
    public string name = "Undefined";
    public void Print() => Console.WriteLine($"{type}: {name}");
}
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Константы, поля и структуры для чтения»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

public const string type = "Person";
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Константы, поля и структуры для чтения»
+50 XP

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

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Константы, поля и структуры для чтения»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Константы, поля и структуры для чтения». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.