Составные элементы класса. Константные поля в классах. Ключевые слова readonly, const
Содержание
- 1. Какие составные элементы может включать класс в языке C#?
- 2. Какие ключевые слова можно использовать при объявлении полей (данных) класса?
- 3. Особенности применения модификатора const для полей класса. Общая форма
- 4. Пример применения модификатора const для поля класса
- 5. Особенности применения модификатора readonly для полей класса. Общая форма
- 6. Пример применения модификатора readonly в классе
- Связанные темы
Поиск на других ресурсах:
1. Какие составные элементы может включать класс в языке C#?
Класс может включать следующие составные элементы:
- поля или данные;
- конструкторы;
- методы;
- перегруженные операторы;
- свойства;
- события;
- вложенные классы.
⇑
2. Какие ключевые слова можно использовать при объявлении полей (данных) класса?
При объявлении полей могут указываться следующие ключевые слова:
- static. Это ключевое слово используется для объявления статического поля данных. Более подробно об использовании статических полей и методов описывается здесь;
- const – используется для для объявления постоянного поля. Значение такого поля нельзя изменять;
- readonly – используется для объявления поля, которое предназначено только для чтения. Допускается устанавливать значение readonly-поля в конструкторе класса только один раз.
⇑
3. Особенности применения модификатора const для полей класса. Общая форма
Модификатор const определяет поле, которое не может изменяться (постоянное поле). Особенности использования поля в классе следующие:
- при объявлении, поле с модификатором const должно быть обязательно проинициализировано некоторым значением;
- константные поля считаются статическими, поэтому извне доступ к таким полям должен быть как для статических с использованием имени класса (а не имени экземпляра).
Общая форма объявления поля с модификатором const имеет вид:
access_modifier const type const_name = value;
где
- access_modifier – один из пяти модификаторов доступа (private, protected, public, internal, protected internal);
- type – тип поля класса, который объявляется как константа;
- const_name – имя константы;
- value – значение константы, которое должно быть совместимым с типом type.
⇑
4. Пример применения модификатора const для поля класса
В примере объявляется класс CircleFigures, реализующий методы для вычисления характеристик геометрических фигур, которые строятся с использованием окружности.
Класс содержит следующие элементы:
- общедоступную константу Pi, которая объявлена с ключевым словом const;
- метод Length(), определяющий длину окружности заданного радиуса;
- метод Area(), определяющий площадь окружности заданного радиуса;
- метод Volume(), определяющий объем сферы заданного радиуса.
В функции main() реализовано создание экземпляра и вызов методов класса. Также продемонстрирован доступ к константному полю Pi, которое неявно считается статическим.
using System; using static System.Console; namespace ConsoleApp2 { // Класс, реализующий вычисление площади различных фигур class CircleFigures { // константное поле - изменить в классе нельзя public const double Pi = 3.141592; // неявно считается статическим // метод, вычисляющий длину окружности заданного радиуса public double Length(double radius) { // используется внутренняя константа Pi return 2 * Pi * radius; } // метод, вычисляющий площадь окружности заданного радиуса public double Area(double radius) { // используется внутренняя константа Pi return Pi * radius * radius; } // метод, вычисляющий объем шара заданного радиуса public double Volume(double radius) { // используется внутренняя константа Pi return 4.0 / 3 * Pi * radius * radius * radius; } } class Program { static void Main(string[] args) { // Использование констант в классах, ключевое слово const // 1. Создать экземпляр класса CircleFigures CircleFigures cf = new CircleFigures(); // 2. Вычислить длину окружности радиуса 1 double length = cf.Length(1.0); // точность вывода - 2 знака после запятой WriteLine("length = {0:f2}", length); // 3. Вычислить площадь окружности радиуса 2 double area = cf.Area(2.0); WriteLine("area = {0:f2}", area); // 4. Вычислить объем шара радиуса 3 double volume; volume = cf.Volume(3.0); WriteLine("volume = {0:f2}", volume); // 5. Обращение к константному полю Pi - используется имя класса WriteLine("Pi = {0}", CircleFigures.Pi); } } }
Результат выполнения программы
length = 6.28 area = 12.57 volume = 113.10 Pi = 3.141592
В вышеприведенном коде при попытке изменения значения константы Pi в методах класса, будет выдана ошибка на этапе компиляции
The left-hand side of an assignment must be a variable, property or indexer
⇑
5. Особенности применения модификатора readonly для полей класса. Общая форма
Поле может быть объявлено с модификатором readonly. Значение такого поля может быть инициализировано одним из двух способов:
- в конструкторе класса;
- сразу при объявлении.
Общая форма объявления поля с модификатором readonly следующая:
access_modifier readonly type var_name = value;
где
- access_modifier – один из пяти модификаторов доступа (private, protected, public, internal, protected internal);
- type – тип объявляемого поля класса;
- var_name – имя поля;
- value – значение, которым инициализируется поле. Значение может быть присвоено только один раз. Значение value должно быть совместимым с типом type.
⇑
6. Пример применения модификатора readonly в классе
В примере демонстрируется применение модификатора readonly в классе, который реализует массив фиксированного размера.
Объявляется класс MyArrayFixed в котором реализованы:
- внутренняя целочисленная переменная Count, объявленная с модификатором readonly. Эта переменная определяет количество элементов в массиве, которое есть фиксированным. Значение этой переменной устанавливается по умолчанию равным 5. В любом конструкторе класса можно изменить это значение только один раз. В других методах класса изменить значение переменной Count невозможно;
- внутренняя переменная DefaultValue типа double, которая объявлена с модификатором readonly. Переменная определяет значение элементов массива, которые присваиваются ему по умолчанию. Правила использования этой переменной такие же как и для переменной Count;
- конструктор MyArrayFixed() с двумя параметрами. Этот конструктор один раз формирует значение readonly-полей класса. Также в конструкторе выделяется память для массива Array и значение элементов устанавливается равным DefaultValue;
- конструктор MyArrayFixed() с одним параметром. Этот конструктор перенаправляется на другой конструктор с двумя параметрами;
- демонстрационный метод SetDefaultValue(), в котором закоментирована попытка изменить значение readonly-поля DefaultValue. Если снять комментарий в строке то компилятор выдаст ошибку.
Текст примера для приложения типа Console Application следующий:
using System; using static System.Console; namespace ConsoleApp2 { // Класс, реализующий масив, в котором количество элементов определяется заданным диапазоном class MyArrayFixed { // объявление полей с модификатором readonly public readonly int Count = 5; // Текущее количество элементов в массиве равно 5 public readonly double DefaultValue; // значение элементов массива по умолчанию public double[] Array = null; // Инициализация полей в конструкторе класса - только один раз public MyArrayFixed(int _Count, double _DefaultValue) { // 1. Инициализировать readonly-поля класса // В массиве должно быть не менее 5 элементов if (_Count > Count) Count = _Count; // можно несколько раз инициализировать readonly-поля но только в конструкторе DefaultValue = 0.0; DefaultValue = _DefaultValue; // 2. Выделить память для массива Array = new double[Count]; // 3. Заполнить массив значениями DefaultValue for (int i = 0; i < Array.Length; i++) Array[i] = DefaultValue; } // Конструктор с 1 параметром public MyArrayFixed(int _Count) : this(_Count, 0.0) { } // Установить значение повторно в методах класса нельзя void SetDefaultValue() { // DefaultValue = 2.5; - ошибка компиляции } } class Program { static void Main(string[] args) { // Использование readonly-полей в классах // 1. Создать объект класса MyArrayFixed MyArrayFixed af = new MyArrayFixed(7, 3.5); // в конструкторе выполняется вся робота // 2. Вывести массив на экран и его readonly-поля WriteLine("Array af."); WriteLine($"af.Count = {af.Count}"); WriteLine("af.DefaultValue = {0}", af.DefaultValue); WriteLine("Items of array:"); for (int i = 0; i < af.Array.Length; i++) { Write("{0}\t", af.Array[i]); } WriteLine(); } } }
Результат работы программы:
Array af. af.Count = 7 af.DefaultValue = 3.5 Items of array: 3.5 3.5 3.5 3.5 3.5 3.5 3.5
⇑
Связанные темы
- Понятие класса. Общая форма объявления класса. Объект класса. Поля класса. Примеры. Ключевое слово this. Вложенные классы
- Инициализация данных в классе. Конструктор класса. Конструктор по умолчанию
⇑