C# Властивості (Get та Set)
Властивості та інкапсуляція
Перш ніж ми почнемо пояснювати властивості, ви повинні мати базове уявлення про "Інкапсуляцію".
Значення інкапсуляції полягає в тому, щоб переконатися, що «конфіденційні» дані приховані від користувачів. Щоб досягти цього, ви повинні:
- оголосити поля/змінні як
private
- надати
public
методиget
таset
через властивості, щоб отримати доступ і оновити значення поляprivate
Властивості
З попереднього розділу ви дізналися, що до private
змінних можна отримати доступ лише в межах одного класу (зовнішній клас не має до нього доступу). Однак іноді нам потрібно отримати до них доступ — і це можна зробити за допомогою властивостей.
Властивість схожа на комбінацію змінної та методу, і вона має два методи: get
та set
:
Приклад
class Person
{
private string name; // поле
public string Name // властивість
{
get { return name; } // get метод
set { name = value; } // set метод
}
}
Пояснення прикладу
Властивість Name
пов’язана з полем name
. Рекомендується використовувати однакові назви як для властивості, так і для приватного поля, але з великою першою літерою.
Метод get
повертає значення змінної name
.
Метод set
призначає value
змінній name
. Ключове слово value
представляє значення, яке ми призначаємо властивості.
Якщо ви не зовсім розумієте це, подивіться на приклад нижче.
Тепер ми можемо використовувати властивість Name
для доступу та оновлення поля private
класу Person
:
Приклад
class Person
{
private string name; // поле
public string Name // властивість
{
get { return name; }
set { name = value; }
}
}
class Program
{
static void Main(string[] args)
{
Person myObj = new Person();
myObj.Name = "Liam";
Console.WriteLine(myObj.Name);
}
}
Виведення буде:
Liam
Автоматичні властивості (скорочення)
C# також надає спосіб використання скорочених / автоматичних властивостей, де вам не потрібно визначати поле для властивості, а вам потрібно лише написати get;
та set;
всередині властивості.
Наступний приклад дасть той самий результат, що й приклад вище. Єдина відмінність полягає в тому, що тут менше коду:
Приклад
Використання автоматичних властивостей:
class Person
{
public string Name // властивість
{ get; set; }
}
class Program
{
static void Main(string[] args)
{
Person myObj = new Person();
myObj.Name = "Liam";
Console.WriteLine(myObj.Name);
}
}
Виведення буде:
Liam
Чому саме інкапсуляція?
- Кращий контроль над членами класу (зменште ймовірність того, що ви (чи інші) зіпсуєте код)
- Поля можна зробити лише для читання (якщо ви використовуєте лише метод
get
) або лише для запису (якщо ви використовуєте лише методset
) - Гнучкий: програміст може змінити одну частину коду, не впливаючи на інші частини
- Підвищена безпека даних