Конструктори в сі-Шарп
У цьому уроці ми поговоримо про такі важливі членах класу, як конструктори.
Конструктор - це метод класу, призначений для ініціалізації об'єкта при його созданіі.Ініціалізація - це завдання початкових параметрів об'єктів / змінних при їх створенні.
У класі, в якому не оголошений жоден конструктор, існує неявний конструктор за замовчуванням, який викликається при створенні об'єкта за допомогою оператора new.
public [ім'я_класу] ([аргументи])
// тіло конструктора
>
Наприклад, у нас є клас Автомобіль. Створюючи новий автомобіль, значення пробігу та кількості палива в баку є сенс поставити рівними нулю:
class Car
private double mileage;
private double fuel;
Без конструктора нам би довелося після створення об'єкта окремо присвоювати значення його полів, що дуже незручно.
Конструктор також може мати параметри.
Приклад з тим же автомобілем, тільки тепер при створенні об'єкта ми можемо поставити будь-які початкові значення:
class Car
private double mileage;
private double fuel;
public Car (double mileage, double fuel)
this.mileage = mileage;
this.fuel = fuel;
>
>
class Program
static void Main (string [] args)
Car newCar = new Car (100, 50); // виклик конструктора з параметрами
>
>
В наведеному вище прикладі використовується ключове слово this.
Покажчик this - це покажчик на об'єкт, для якого був викликаний нестатичних метод. Ключове слово this забезпечує доступ до поточного екземпляру класу. Класичний приклад використання this. це як раз в конструкторах, при однакових іменах полів класу і аргументів конструктора. Ключове слово this це щось на зразок імені об'єкта, через яке ми маємо доступ до поточного об'єкту.
У класі може свідчити безліч конструкторів, головне щоб вони відрізнялися сигнатурами. Сигнатура. в разі конструкторів, - це набір аргументів. Наприклад, не можна створити два конструктора, які приймають два аргументи типу int.
Приклад використання декількох конструкторів:
class Car
private double mileage;
private double fuel;
public Car (double mileage, double fuel)
this.mileage = mileage;
this.fuel = fuel;
>
>
class Program
<
static void Main (string [] args)
Car newCar = new Car (); // створюємо автомобіль з параметрами за замовчуванням, 0 і 0
Car newCar2 = new Car (100, 50); // створюємо автомобіль з вказаними параметрами
>
>
Якщо в класі визначено один або кілька конструкторів з параметрами, ми не зможемо створити об'єкт через неявний конструктор за замовчуванням:
class Car
private double mileage;
private double fuel;
public Car (double mileage, double fuel)
this.mileage = mileage;
this.fuel = fuel;
>
>
class Program
<
static void Main (string [] args)
Car newCar = new Car (100, 50);
Car newCar2 = new Car (); // помилка, в класі не визначений конструктор без параметрів
>
>
Створіть клас Студент, визначте в ньому поля: ім'я, курс, чи є у нього стипендія. Створіть в класі кілька конструкторів, для можливості завдання відразу всіх зазначених параметрів або декількох при створенні екземплярів.
Властивості в Сі-Шарп. Аксессор get і set. автоматичні властивості
У цьому уроці ми продовжимо розглядати члени класів, і на черзі у нас властивості.
[Модифікатор доступу] [тип] [імя_свойства]
get
// тіло аксессор для читання з поля
>
set
// тіло аксессор для запису в поле
>
>
Наведу приклад використання властивостей. Є клас Студент. і в ньому є закрите поле курс, яке не може бути нижче одиниці і більше п'яти. Для управління доступом до цього поля буде використано властивість Year:
Простіше кажучи, у властивості реалізуються два методи. У тілі аксессор get може бути більш складна логіка доступу, але в підсумку повинно повертатися значення поля, або інше значення за допомогою оператора return. У аксессор set же присутній неявний параметр value. який містить значення, що привласнюється властивості (в прикладі вище, під час запису, значеніеvalue одно «0»).
Якщо, наприклад, ми б просто зробили поле year відкритим і не використовували ні методи, ні властивість для доступу, ми могли б записати в це поле будь-яке значення, в тому числі і некоректне, а так ми можемо контролювати читання і запис.
Для контролю доступу ми могли б тут використовувати прості методи, але для цього нам би довелося реалізувати два окремих методу, з різними іменами, і при зверненні до них необхідно використовувати дужки, що додає зайві незручності. Ось як би виглядала та сама програма з використанням методів (на практиці використовуйте властивості):
class Student
private int year;
public int GetYear ()
return year;
>
public void SetYear (int value)
if (value <1)
year = 1;
else if (value> 5)
year = 5;
else year = value;
>
>
class Program
<
static void Main (string [] args)
Student st1 = new Student ();
st1.SetYear (0);
Console.WriteLine (st1.GetYear ());
Console.ReadKey ();
>
>
Властивість також може надавати доступ тільки на читання поля або тільки на запис. Якщо, наприклад, нам необхідно закрити доступ на запис, ми просто не вказуємо аксессор set. приклад:
class Student
private int year;
public Student (int y) // конструктор
year = y;
>
public int Year
get
return year;
>
>
>
class Program
<
static void Main (string [] args)
Student st1 = new Student (2);
Console.WriteLine (st1.Year); // читання
st1.Year = 5; // помилка, властивість тільки на читання
Console.ReadKey ();
>
>
Варто пам'ятати, що саме властивість не визначає місце в пам'яті для зберігання поля, і, відповідно, необхідно окремо оголосити поле, доступом до якому буде управляти властивість.
[Модифікатор доступу] [тип] [імя_свойства]
У таких властивостей, у їх аксессор відсутнє тіло. Приклад використання:
class Student
public int Year
>
class Program
<
static void Main (string [] args)
Student st1 = new Student ();
st1.Year = 0;
Console.WriteLine (st1.Year);
Console.ReadKey ();
>
>
Автоматично реалізовані властивості є сенс використовувати тоді, коли немає необхідності накладати будь-які обмеження на можливі значення неявного поля властивості.
І тут у вас може виникнути питання, а в чому тоді різниця між простими відкритими полями і автоматичними властивостями. У таких властивостей залишається можливість робити їх тільки на читання або тільки на запис. Для цього вже використовується модифікатор доступу private перед ім'ям аксессор:
public int Year
public int Year
Створіть клас Телевізор. оголосіть в ньому поле гучність звуку. для доступу до цього поля реалізуйте властивість. Гучність може бути в діапазоні від 0 до 100.