C#. Составные элементы класса. Константные поля в классах. Ключевые слова readonly, const

Составные элементы класса. Константные поля в классах. Ключевые слова readonly, const


Содержание


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

 


Связанные темы