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. Створити екземпляр класу Circle Figures
      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

 


Зв’язані теми