Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие КНЕУ.doc
Скачиваний:
24
Добавлен:
07.03.2016
Размер:
3.9 Mб
Скачать

5.1. Привласнення і порівняння об'єктів

Механізм виконання привласнення один і той же для величин будь-якого типу, як посилального, так і значущого, проте результати розрізняються. При наданні значення копіюється значення, а при привласненні посилання - посилання, тому після привласнення одного об'єкту іншому ми отримуємо два посилання, вказуючи на одну і ту ж область пам'яті (рис. 5.2).

Рисунок ілюструє ситуацію, коли було створено три об'єкти, а, b і с, а потім виконано привласнення b = с. Старе значення b стає недоступним і очищається складальником сміття. З цього виходить, якщо змінити значення однієї величини посилального типу, це може відбитися на іншій (в даному випадку, якщо змінити об'єкт через посилання с, об'єкт b також змінить своє значення).

Аналогічна ситуація з операцією перевірки на рівність. Величини значущого типу рівні, якщо рівні їх значення. Величини посилального типу рівні, якщо вони посилаються на одні і ті ж дані (на рисунку об'єкти b і с рівні, але а не рівне b навіть при рівності їх значень або якщо вони обидві рівні null).

Рис. 5.1. Склад класу

Рис. 5.2. Привласнення об'єктів

5.2. Дані: поля і константи

Дані, що містяться в класі, можуть бути змінними або Змінні, описані в класі, називаються полями класу.

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

[ атрибути ] [ специфікатори ] [ const ] тип ім'я [ = начальне_значення ]

Атрибути будуть розглянуті в розділі 12, а можливі специфікатори полів і констант перераховані в таблиці 5.2. Для констант можна використовувати тільки специфікатори 1- 6.

Таблиця 5.2.

Специфікатори полів і констант класу

Специфікатор

Опис

1

new

Новий опис поля, що приховує успадкований елемент класу

2

public

Доступ до елементу не обмежений

3

protected

Доступ тільки з даного класу і похідних класів

4

internal

Доступ тільки з даної збірки

5

protected internal

Доступ тільки з даного класу і похідних класів і з даної збірки

6

private

Доступ тільки з даного класу

7

static

Одне поле для всіх екземплярів класу

8

readonly

Поле доступне тільки для читання

9

volatile

Поле може змінюватися іншим процесом або системою

За умовчанням елементи класу вважаються за закриті ( private ) . Для полів класу цей вид доступу є переважним, оскільки поля визначають внутрішню будову класу, яка має бути прихована від користувача. Всі методи класу мають безпосередній доступ до його закритих полів.

Поля, описані із специфікатором static, а також константи існують в єдиному екземплярі для всіх об'єктів класу, тому до них звертаються не через ім'я екземпляра, а через ім'я класу. Якщо клас містить тільки статичні елементи, екземпляр класу створювати не потрібно.

Звернення до поля класу виконується за допомогою операції доступу (крапка). Праворуч від крапки задається ім'я поля, зліва - ім'я екземпляра для звичайних полів або ім'я класу для статичних. У лістингу 5.1 приведені приклад простого класу Demo і два способи звернення до його полів.

Лістинг 5.1. Клас Demo, що містить поля і константу

using System;

namespace ConsoleApplication1

{

class Demo

{

public int a = 1; // поле даних

public const double с = 1.66; // константа

public static string s = "Demo"; // статичне поле класу

double y; // закрите поле даних

}

class Classl

{

static void Main( )

{

Demo x = new Demo( ); // створення екземпляра класу Demo

Console . WriteLine ( x.a ); // x.a - звернення до поля класу

Console . WriteLine ( Demo.с ); // Demo.с - звернення до константи

Console . WriteLine ( Demo.s ); // звернення до статичного поля

}

}

}

Поле у вивести на екран аналогічним чином не вдасться: воно є закритим, тобто недоступно ззовні ( з класу Classl). Оскільки значення цьому полю явним чином не привласнене, середовище привласнює йому значення нуль.

Всі поля спочатку автоматично ініціалізувалися нулем відповідного типу (наприклад, полям типу int привласнюється 0, а посиланням на об'єкти - значення nu11) . Після цього полю привласнюється значення, задане при його явній ініціалізації. Завдання початкових значень для статичних полів виконується при ініціалізації класу, а звичайних - при створенні екземпляра.

Поля із специфікатором readonly призначені тільки для читання. Встановити значення такого поля можна або при його описі, або в конструкторі (конструктори розглядаються далі в цьому розділі).