Инициализация в классах. Способы инициализации данных в классе. Инициализация переменных базовых типов. Инициализация с помощью инициализаторов объектов

Инициализация в классах. Способы инициализации данных в классе. Инициализация переменных базовых типов. Инициализация с помощью инициализаторов объектов


Содержание


1. Какие существуют способы инициализации данных в классе при создании объекта класса?

В языке C# создание объекта класса осуществляется с помощью оператора new. Во время создания, внутренние данные (переменные) класса могут быть инициализированы одним из следующих способов:

  • с помощью присваивания переменной класса нужного значения при ее объявлении (непосредственная инициализация). Этот способ используется только для переменных базовых типов. Если нужно инициализировать объект класса, то используется инициализатор объектов;
  • с помощью конструктора класса;
  • с помощью инициализатора объектов. Этот способ применяется для объектов классов или структурных переменных. В этом случае, данные класса должны быть объявлены как общедоступные public.

2. Общая форма инициализации внутренних данных класса с помощью непосредственного присваивания нужного значения

Внутренние данные класса могут быть инициализированы сразу при их объявлении с помощью конструкции вида:

type variable = value;

В этой конструкции переменная с именем variable типа type инициализируется значением value.

3. Пример инициализации одиночной переменной базового типа в классе

Задан класс Month, реализующий месяц года. В классе объявляется одна скрытая переменная month, которая инициализируется значением 5 сразу при объявлении

// класс, реализующий месяц года
class Month
{
  // инициализация внутренней переменной при ее объявлении
  int month = 5;

  public int GetMonth() { return month; }
  public void SetMontgh(int _month) { month = _month; }
}

Демонстрация использования объекта класса Month в другом программном коде

Month mn = new Month();
int t = mn.GetMonth(); // t = 5

4. Пример инициализации массива переменных базового типа в классе

Демонстрируется инициализация массива из 5 чисел типа double, который объявлен в классе ArrayDouble5.

// класс, реализующий массив из 5 чисел типа double
class ArrayDouble5
{
  // инициализация массива при его объявлении
  double[] A = { 3.5, 8.2, 1.6, 2.8, -0.0025 };

  // методы доступа
  // взять элемент массива с индексом index
  public double GetAi(int index)
  {
    if ((index >= 0) && (index < 5))
      return A[index];
    return 0.0;
  }

  // записать новое значение в элемент массива
  public void SetAi(int index, double value)
  {
    if ((index >= 0) && (index < 5))
      A[index] = value;
  }
}

Использование класса может быть следующим

// инициализация массива в классе
ArrayDouble5 ad = new ArrayDouble5();

double val = ad.GetAi(3); // val = 2.8
val = ad.GetAi(4); // val = -0.0025

5. Использование инициализатора объекта для инициализации объекта класса в другом классе

Демонстрируется инициализация объектов классов с помощью инициализаторов объектов. Заданы три класса Line, Triangle, Figures. В классе Line объявляются общедоступные (public) переменные, описывающие координаты отрезка на плоскости. В классе Triangle объявляются общедоступные (public) переменные, задающие координаты точек треугольника.



В классе Figures объявляются два объекта (экземпляры) классов Line и Triangle. В классе Figures осуществляется инициализация объектов классов Line и Triangle с помощью инициализаторов объектов.

// класс, реализующий линию на координатной плоскости
class Line
{
  public int x1, y1, x2, y2;
}

// класс, описывающий треугольник на координатной плоскости
class Triangle
{
  public int x1, y1, x2, y2, x3, y3;
}

// класс, реализующий фигуру
class Figures
{
  // инициализация объекта класса
  Line ln = new Line { x1 = 0, y1 = 3, x2 = 2, y2 = 5 };
  Triangle tr = new Triangle { x1 = 1, y1 = 1, x2 = 4, y2 = 0, x3 = 2, y3 = 1 };

  // методы доступа
  public Line GetLine() { return ln; }
  public Triangle GetTriangle() { return tr; }
}

Демонстрация использования класса Figures

Figures fg = new Figures();
Line ln;
Triangle tr;
int t;

ln = fg.GetLine();
t = ln.x2; // t = 2
t = ln.y1; // t = 3

tr = fg.GetTriangle();
t = tr.y2; // t = 0
t = tr.x3; // t = 2

6. Использование инициализатора объекта для инициализации массива объектов в классе

В примере продемонстрирована инициализация массива объектов типа Worker в классе Workers. Инициализация осуществляется с помощью инициализатора объектов.

// класс, описывающий работника
class Worker
{
  // обязательно с модификатором доступа public
  public string name; // Ф.И.О. работника
  public int age; // возраст
  public double salary; // зарплата
}

// класс, в котором объявляется массив из 3 объектов типа Worker
class Workers
{
  public Worker[] wr = 
  {
    new Worker { name = "Filippov F.F.", age = 35, salary = 70320.55 },
    new Worker { name = "Johansonn S.", age = 37, salary = 66670.57 },
    new Worker { name = "Gustaffson G.G.", age = 69, salary = 129380.55 }
  };
}

Важно: для того, чтобы можно было инициализировать массив Worker[] в классе Workers, нужно чтобы данные класса Worker были объявлены с модификатором доступа public.

Использование массива объектов wr может быть следующим:

Workers W = new Workers();
string name;
int age;
double salary;

name = W.wr[1].name; // name = Johansonn S.
age = W.wr[1].age; // age = 37
salary = W.wr[1].salary; // salary = 66670.57

7. Использование инициализатора объекта для инициализации структурной переменной в классе

Объявляется структура Book, реализующая книгу. В классе CBook демонстрируется инициализация структурной переменной типа Book.

Инициализация возможна только тогда, когда структурная переменная в классе представлена как тип-ссылка. Это значит, что для структурной переменной выделяется память оператором new.

// структура, которая описывает книгу
struct Book
{
  public string title; // название книги
  public string author; // Ф.И.О. автора
  public int year; // год выпуска
  public float price; // стоимость книги
}

class CBook
{
  // инициализация структурной переменной в классе как типа-ссылки
  public Book b = new Book { title = "Tell the time 5+", author = "H. Cather", year = 2017, price = 110.00f };
}

Использование объекта класса CBook может быть следующим:

// объект класса CBook
CBook cb = new CBook();
string ttl = cb.b.title; // ttl = "Tell the time 5+"

Важно: для того, чтобы можно было инициализировать объект b типа Book в классе CBook, поля структуры (title, author, year, price) должны быть объявлены как public.

8. Пример использования инициализатора объекта для инициализации массива структурных переменных

В данном примере демонстрируется объявление и инициализация массива структур типа Book в классе CBook.

// структура, описывающая книгу
struct Book
{
  public string title; // название книги
  public string author; // Ф.И.О. автора
  public int year; // год выпуска
  public float price; // стоимость книги
}

class Books
{
  // инициализация массива структурных переменных в классе
  public Book[] B =
  {
    new Book { title = "Computer coding for kids", author = "Carol Vorderman", year = 2015, price = 320.00f },
    new Book { title = "Math and English", author = "Paul Broadbent", year = 2015, price = 310.00f },
    new Book { title = "Spelling 5+", author = "Hannah Catner", year = 2017, price = 0.00f }
  };
}

Использование объекта класса Books в другом программном коде

// объект класса Books
Books bk = new Books();
string author = bk.B[2].author; // author = "Hannah Catner"

9. Пример инициализации переменной и массива переменных типа перечисление (enum)

Задано перечисление Months, определяющее месяцы года. В примере демонстрируется:

  • инициализация переменной типа перечисление Months в классе CMonths. Инициализируются 3 переменные (члены данных класса) с именами mn1, mn2, mn3;
  • инициализация массива переменных типа перечисление Months в классе CMonths.
// месяц года
enum Months
{
  Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
}

// класс, в котором инициализируются внутренние переменные типа перечисление
class CMonths
{
  public Months mn1 = Months.Feb;
  public Months mn2 = Months.Jun;
  public Months mn3 = Months.Nov;

  // массив переменных типа перечисление
  Months[] array = { Months.Sep, Months.Jun, Months.Jan };
}

10. Какие требования накладываются на объявление переменной класса в случае инициализации этой переменной инициализатором объекта?

Чтобы инициализировать переменную класса с помощью инициализатора объекта, эта переменная должна быть объявлена как общедоступная с модификатором доступа public. В противном случае компилятор выдаст сообщение об ошибке:

Variable is inaccessible due to its protection level

где variable – название переменной в классе, которое нужно инициализировать.

 


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