2013
Курс по програмиране на C#
Занятие №10
Свойства. Индексатори. Статични членове
Съдържание
• Свойства
• Индексатори
• Капсулиране със свойства и индексатори
• Статични членове
• Статични полета
• Статични методи
• Статични конструктори
• Статични свойства
Свойства
• Какво е „свойство“?
– Вид член на клас
– Описва поведение на класа
– За външния код изглежда като характеристика
– Служи за изпълнение на операции при прочитането или
присвояването на стойност на характеристика на обект
– Заменя аксесорите и мутаторите при капсулиране на класа
– Може да се използва за реализиране на характеристика, която не
се съхранява в поле на обекта, а може да бъде изчислена
посредством други вътрешни данни на обекта
Свойства
• Деклариране на свойства
– Както повечето членове, свойствата имат видимост
– Тип данни
– Уникално наименование в рамките на класа
– Блок с операции, които да се изпълнят при прочитане на стойността
на свойството; задължително трябва да бъде върнат резултат от
указания тип
– Блок с операции, които да се изпълнят при присвояване на
стойност на свойството; присвоената стойност се достъпва члез
стандартната дума value, която играе ролята на параметър
– Един от двата блока може да бъде пропуснат: свойства само за
четене или свойства само за запис
Свойства
class Animal
{
// Частно поле за съхраняване на данните
private string _species;
// Свойство за капсулиране на данните
public string Species
{
// Блок за четене
get { return _species; }
// Блок за запис
set
{
if (!string.IsNullOrEmpty(value))
_species = value;
}
}
}
• Деклариране на свойства
– Модификатор за достъп
– Тип данни
– Наименование
– Блок, съдържащ get и/или set блок
– get блок:
• Ключова дума get
• Блок с операции, които да бъдат изпълнени
при прочитане на стойността на свойството
• Трябва да бъде върната стойност от подходящ
тип
– set блок:
• Ключова дума set
• Блок с операции, които да бъдат изпълнени
при присвояване на стойност на свойството
• Присвоената стойност се достъпва чрез
стандартната дума value
Деклариране на свойства - демо
// Демонстрация
Свойства
Animal cat = new Animal();
// Присвояване на стойност на свойство
cat.Species = "Felis silvestris catus";
// Прочитане на стойността на свойство
Console.WriteLine(cat.Species);
// Присвояване на стойност при инстанциране
// на обект с инициализация
Animal dog = new Animal
{
Species = "Canis lupus familiaris",
};
• Употреба на свойства
– Стойността на свойство се достъпва по
същия начин, както и тази на поле
– Израз, рефериращ обекта
– Оператор за достъпване на член „.“
– Наименование на свойството
– Фундаменталната разлика е в това, че
съответната прочетена или присвоена
стойност не е задължително да се пази
в паметта на обекта
Употреба на свойства - демо
// Демонстрация
Свойства
class User
{
private string _userName;
private bool _isLocked;
// Свойство само за четене
public string UserName
{
get { return _userName; }
}
// Свойство само за запис
public bool IsLocked
{
set { _isLocked = value; }
}
}
• Деклариране на свойства само за
четене
– Декларира се само get блок
– Компилаторът не разрешава
присвояване на стойност на
свойството
• Деклариране на свойство само за
запис
– Декларира се само set блок
– Компилаторът не разрешава
прочитане на стойността на свойството
Свойства само за четене и свойства само за запис -
демо
// Демонстрация
Свойства
class Shape2D
{
private double _area;
public double Area
{
// Публичен достъп за четене
get { return _area; }
// Защитен достъп за запис
protected set
{
if (value > 0.0)
_area = value;
}
}
}
• Свойства с различна видимост на
get и set блоковете
– Пред един от get и set блоковете може
да се постави модификатор за достъп
– Видимостта на съответния блок трябва
да е по-ограничена от видимостта на
цялото свойство
Свойства с различна видимост на get и set блоковете -
демо
// Демонстрация
Свойства
class Building
{
// Ръчно капсулирано със свойство поле
private double _height;
public double Height
{
get { return _height; }
set { _height = value; }
}
// Автоматично генерирано свойство
public double Area { get; set; }
// Автоматично генерирано свойство с
// различна видимост на блоковете
public bool IsDemolished { get;
private set; }
}
• Автоматично генерирани свойства
– Вместо get и set блокове се поставят
само двете ключови думи, следвани от
точки и запетаи
– Компилаторът автоматично създава
частно поле за съхранение на данните
за автоматично генерираното свойство
– Удобно, когато не е необходимо
специално поведение, освен
прочитане и записване на данните в
частно поле
– Възможно е да се укаже различна
видимост на get и set блоковете
Автоматично генерирани свойства - демо
// Демонстрация
Индексатори
• Какво е „индексатор“?
– Вид член на клас
– Описва поведение на класа
– Служи за достъпване на елемент по пореден номер или друг/и
параметър/ри, подобно на елементите на масив, чрез оператора
за индексиране на елемент []
– Удобен за реализиране на класове, които представляват колекции
от елементи
Индексатори
• Деклариране на индексатори
– Както повечето членове, индексаторите имат видимост
– Няма наименование
– Тип данни на елементите, които се индексират
– Списък от параметри (поне един)
– Блокове от операции за четене и/или записване на стойност на
съответния елемент – подобно на свойство
– В един клас може да се декларират няколко индексатора, стига те
да се различават по броя или типовете данни на параметрите си
(подобно на методите)
Индексатори
class Song
{
// ...
}
class Album
{
// Частно поле за съхранение на песните
private Song[] _songs;
// Индексатор за достъпване на песните
public Song this[int index]
{
// Блок за четене на елемент
get { return _songs[index - 1]; }
// Блок за записване на елемент
set { _songs[index - 1] = value; }
}
}
• Деклариране на индексатори
– Модификатор за достъп
– Тип данни на индексираните елементи
– Ключова дума this
– Списък от параметри, заградени в
квадратни скоби
– Блок, съдържащ get и/или set блок
– Както и при свойствата, get и set
блоковете може да са с различна
видимост
Деклариране на индексатори - демо
// Демонстрация
Индексатори
Album album = new Album(11)
{
Artist = "Pearl Jam",
Title = "Ten",
};
// Записване на елемент по индекс
album[1] = new Song
{
Title = "Once",
};
album[2] = new Song
{
Title = "Even Flow",
};
// Прочитане на елемент по индекс
Console.WriteLine(album[1].Title);
• Употреба на индексатори
– Индексатор на обект се използва със
същия синтаксис, както при
индексиране на елемент в масив
– Променлива или израз, който
реферира обекта-колекция
– Един или повече аргументи, заградени
в квадратни скоби
Употреба на индексатори - демо
// Демонстрация
Капсулиране чрез свойства и индексатори
• Свойствата и индексаторите „обличат“ поведението на
обекта в по-удобни и по-интуитивни за употреба синтактични
конструкции
• Всичко, което може да се осъществи чрез свойство или
индексатор, може да бъде реализирано и чрез
обикновен(и) метод(и)
• Препоръчва се употребата на свойства и индексатори,
където е възможно/уместно
Капсулиране чрез свойства и индексатори - демо
// Демонстрация
Статични членове
• Какво е „статичен член“ на клас/структура?
– Не е обвързан с конкретен екземпляр на типа данни ,в който е
деклариран
– Обвързан е със самия тип данни
– Достъпва се директно през типа данни
– Декларира се подобно на обикновен (екземплярен) член, но се
поставя ключовата дума static след модификатора за достъп
Статични полета
• Статични полета
– Съхраняват характеристики на класа, а не на конкретни негови
екземпляри
– За всяко статично поле се заделя единствено място в паметта,
обвързано със самия клас
– Константните полета са статични по подразбиране
– Често се използват за съхраняване на помощна информация, от
която се нуждаят екземплярите на класа
Статични полета
class Book
{
// Деклариране на статично поле за брой
// инстанцирани обекти от тип Book
public static int BookCount;
// Деклариране на статично поле за глобален
// масив от книги
public static Book[] Books = new Book[100];
}
• Деклариране на статични полета
– Модификатор за достъп
– Ключова дума static
– Тип данни
– Наименование (уникално измежду
всички членове на класа, независимо
дали са статични)
– Стойност по подразбиране
(незадължителна)
Статични полета
class Book
{
// ...
// Поле за номер на книга
private int _bookNumber;
// Екземплярен конструктор на класа
public Book()
{
// Генериране на номера на новата книга
_bookNumber = BookCount;
// Вкарване на книгата в глобалния масив
Books[BookCount] = this;
// Увеличаване на броя книги с 1
BookCount++;
}
}
// ...
// Достъпване на списъка с книги в главната програма
Book book = Book.Books[2];
• Използване на статични полета
– Наименование на класа, в който е
декларирано статичното поле
– Оператор за достъп на член „.“
– Наименование на статичното поле
– Могат да се достъпват директно в
декларациите както на статичните, така
и на екземплярните членове на класа
– Не могат да се достъпват през
екземпляр на класа (включително this)
Статични полета - демо
// Демонстрация
Статични методи
• Статични методи
– Описват поведение, което не е обвързано с конкретен екземпляр
на класа
– Няма достъп до текущия екземпляр на класа (тъй като няма такъв) –
не може да се използва ключовата дума this, нито могат да се
достъпват пряко екземплярните членове на класа
– Могат да се достъпват пряко статичните членове на класа
– Много от стандартните методи, с които вече сте запознати, са
статични
– Главната програма на всяко приложение в C# на практика е
статичен метод
Статични методи
class Book
{
// ...
// Статичен метод за отстраняване на книга
// от глобалния масив
public static void RemoveBook(int index)
{
// Проверка за валиден индекс на книга
if (index < 0 || index >= BookCount)
return;
// Преместване на следващите книги назад
for (int i = index; i < BookCount - 1; i++)
{
Books[i] = Books[i + 1];
Books[i]._bookNumber--;
}
// Намаляване на броя книги с 1
BookCount--;
}
}
• Деклариране на статични методи
– Модификатор за достъп
– Ключова дума static
– Тип данни на връщания резултат (или
ключова дума void)
– Наименование
– Списък от параметри в кръгли скоби
– Блок с операции (тяло)
– В тялото не може да се използва ключовата
дума this, нито да се достъпват директно
екземплярни членове
– Могат да се достъпват директно статични
членове
– Могат да се декларират методи с еднакви
наименования и различни по брой или
типове параметри
Статични методи
class Book
{
// ...
// Екземплярен метод за премахване на текущата
// книга от глобалния масив
public void RemoveFromList()
{
RemoveBook(_bookNumber);
}
}
// Премахване на книги от списъка в главната програма
Book.Books[3].RemoveFromList();
Book.RemoveBook(0);
• Използване на статични методи
– Наименование на класа, в който е
декларирано статичният поле
– Оператор за достъп на член „.“
– Наименование на статичния метод
– Списък с аргументи в кръгли скоби
– Могат да се достъпват директно в
декларациите както на статичните, така
и на екземплярните членове на класа
– Не могат да се достъпват през
екземпляр на класа (включително this)
Статични методи - демо
// Демонстрация
Статични конструктори
• Статични конструктори
– Описват поведение, което се изпълнява еднократно при
инициализацията на класа
– Удобни за инициализиране на статични полета
– Могат да се достъпват статичните членове на класа
– Програмистът не извиква статичните конструктори явно и няма
контрол кога точно да бъдат изпълнени
– Не приемат параметри
– Като правило се изпълняват непосредствено преди първата
употреба на съответния клас в програмата
Статични конструктори
class Book
{
// ...
// Статичен конструктор на класа
static Book()
{
BookCount = 0;
Books = new Book[100];
}
}
• Деклариране на статични
конструктори
– Не се поставя модификатор за достъп
– Ключова дума static
– Наименование на класа
– Празни кръгли скоби (празен списък с
параметри)
– Блок с операции (тяло)
– В тялото не може да се използва ключовата
дума this, нито да се достъпват директно
екземплярни членове
– Могат да се достъпват директно статични
членове
Статични конструктори - демо
// Демонстрация
Статични свойства
• Статични свойства
– Представляват свойства, обвързани със самия клас, а не с
конкретен негов екземпляр
– Обвиват поведение, но за външния код се държат като статични
полета
– Удобни за обвиване на статични полета (например за отложено
зареждане на стойността на статично поле или за капсулирането
му)
– Налице са всички възможности на екземплярните свойства, с
описаните ограничения за статични методи
Статични свойства
class Book
{
// Частно статично поле за глобален масив от
// книги
private static Book[] _books = new Book[100];
// Публично свойство само за четене за
// глобален масив от книги
public static Book[] Books
{
get { return _books; }
}
// Автоматично генерирано статично свойство с
// публичен достъп за брой инстанцирани обекти
// от тип Book
public static int BookCount { get; private set; }
}
• Деклариране на статични свойства
– Модификатор за достъп
– Ключова дума static
– Тип данни
– Наименование
– Блок, съдържащ get и/или set блокове
– В блоковете не може да се използва
ключовата дума this, нито да се достъпват
директно екземплярни членове
– Могат да се достъпват директно статични
членове
– get и set блоковете може да имат различна
видимост, както при екземплярните
свойства
– Могат да се създават автоматично
генерирани статични свойства
Статични свойства
class Book
{
// ...
// Поле за номер на книга
private int _bookNumber;
// Екземплярен конструктор на класа
public Book()
{
// Генериране на номера на новата книга
_bookNumber = BookCount;
// Вкарване на книгата в глобалния масив
Books[BookCount] = this;
// Увеличаване на броя книги с 1
BookCount++;
}
}
// ...
// Достъпване на списъка с книги в главната програма
Book book = Book.Books[2];
• Използване на статични свойства
– Наименование на класа, в който е
декларирано статичното свойство
– Оператор за достъп на член „.“
– Наименование на статичното свойство
– Могат да се достъпват директно в
декларациите както на статичните, така
и на екземплярните членове на класа
– Не могат да се достъпват през
екземпляр на класа (включително this)
Статични свойства - демо
// Демонстрация
Задачи за упражнение
• Преработете програмите от предишните упражнения
(геометрични фигури, библиотека и походова конзолна
ролева игра), така че да се възползвате от новите
възможности на езика, за които научихте:
– Използвайте свойства и индексатори вместо методи, където е
уместно, за да капсулирате обектите
– Създайте статични методи за въвеждане на нов екземпляр на
съответния клас от клавиатурата
– Възползвайте се от статичните полета, конструктори и свойства, за
да споделите информация между отделните екземпляри на един
клас (например екземпляр на класа Random)
– Изнесете поведението, което не е обвързано с конкретен
екземпляр на класа, в статични методи
Въпроси?
Благодаря!
• Александър Далемски
– sasho@david.bg
– Skype: musasho
– https://facebook.com/adalemski
• ДАВИД академия
– acad@david.bg
– http://acad.david.bg/
– @david_academy
– https://facebook.com/DavidAcademy

Училищен курс по програмиране на C# (2013/2014), занятие №10

  • 1.
    2013 Курс по програмиранена C# Занятие №10 Свойства. Индексатори. Статични членове
  • 2.
    Съдържание • Свойства • Индексатори •Капсулиране със свойства и индексатори • Статични членове • Статични полета • Статични методи • Статични конструктори • Статични свойства
  • 3.
    Свойства • Какво е„свойство“? – Вид член на клас – Описва поведение на класа – За външния код изглежда като характеристика – Служи за изпълнение на операции при прочитането или присвояването на стойност на характеристика на обект – Заменя аксесорите и мутаторите при капсулиране на класа – Може да се използва за реализиране на характеристика, която не се съхранява в поле на обекта, а може да бъде изчислена посредством други вътрешни данни на обекта
  • 4.
    Свойства • Деклариране насвойства – Както повечето членове, свойствата имат видимост – Тип данни – Уникално наименование в рамките на класа – Блок с операции, които да се изпълнят при прочитане на стойността на свойството; задължително трябва да бъде върнат резултат от указания тип – Блок с операции, които да се изпълнят при присвояване на стойност на свойството; присвоената стойност се достъпва члез стандартната дума value, която играе ролята на параметър – Един от двата блока може да бъде пропуснат: свойства само за четене или свойства само за запис
  • 5.
    Свойства class Animal { // Частнополе за съхраняване на данните private string _species; // Свойство за капсулиране на данните public string Species { // Блок за четене get { return _species; } // Блок за запис set { if (!string.IsNullOrEmpty(value)) _species = value; } } } • Деклариране на свойства – Модификатор за достъп – Тип данни – Наименование – Блок, съдържащ get и/или set блок – get блок: • Ключова дума get • Блок с операции, които да бъдат изпълнени при прочитане на стойността на свойството • Трябва да бъде върната стойност от подходящ тип – set блок: • Ключова дума set • Блок с операции, които да бъдат изпълнени при присвояване на стойност на свойството • Присвоената стойност се достъпва чрез стандартната дума value
  • 6.
    Деклариране на свойства- демо // Демонстрация
  • 7.
    Свойства Animal cat =new Animal(); // Присвояване на стойност на свойство cat.Species = "Felis silvestris catus"; // Прочитане на стойността на свойство Console.WriteLine(cat.Species); // Присвояване на стойност при инстанциране // на обект с инициализация Animal dog = new Animal { Species = "Canis lupus familiaris", }; • Употреба на свойства – Стойността на свойство се достъпва по същия начин, както и тази на поле – Израз, рефериращ обекта – Оператор за достъпване на член „.“ – Наименование на свойството – Фундаменталната разлика е в това, че съответната прочетена или присвоена стойност не е задължително да се пази в паметта на обекта
  • 8.
    Употреба на свойства- демо // Демонстрация
  • 9.
    Свойства class User { private string_userName; private bool _isLocked; // Свойство само за четене public string UserName { get { return _userName; } } // Свойство само за запис public bool IsLocked { set { _isLocked = value; } } } • Деклариране на свойства само за четене – Декларира се само get блок – Компилаторът не разрешава присвояване на стойност на свойството • Деклариране на свойство само за запис – Декларира се само set блок – Компилаторът не разрешава прочитане на стойността на свойството
  • 10.
    Свойства само зачетене и свойства само за запис - демо // Демонстрация
  • 11.
    Свойства class Shape2D { private double_area; public double Area { // Публичен достъп за четене get { return _area; } // Защитен достъп за запис protected set { if (value > 0.0) _area = value; } } } • Свойства с различна видимост на get и set блоковете – Пред един от get и set блоковете може да се постави модификатор за достъп – Видимостта на съответния блок трябва да е по-ограничена от видимостта на цялото свойство
  • 12.
    Свойства с различнавидимост на get и set блоковете - демо // Демонстрация
  • 13.
    Свойства class Building { // Ръчнокапсулирано със свойство поле private double _height; public double Height { get { return _height; } set { _height = value; } } // Автоматично генерирано свойство public double Area { get; set; } // Автоматично генерирано свойство с // различна видимост на блоковете public bool IsDemolished { get; private set; } } • Автоматично генерирани свойства – Вместо get и set блокове се поставят само двете ключови думи, следвани от точки и запетаи – Компилаторът автоматично създава частно поле за съхранение на данните за автоматично генерираното свойство – Удобно, когато не е необходимо специално поведение, освен прочитане и записване на данните в частно поле – Възможно е да се укаже различна видимост на get и set блоковете
  • 14.
  • 15.
    Индексатори • Какво е„индексатор“? – Вид член на клас – Описва поведение на класа – Служи за достъпване на елемент по пореден номер или друг/и параметър/ри, подобно на елементите на масив, чрез оператора за индексиране на елемент [] – Удобен за реализиране на класове, които представляват колекции от елементи
  • 16.
    Индексатори • Деклариране наиндексатори – Както повечето членове, индексаторите имат видимост – Няма наименование – Тип данни на елементите, които се индексират – Списък от параметри (поне един) – Блокове от операции за четене и/или записване на стойност на съответния елемент – подобно на свойство – В един клас може да се декларират няколко индексатора, стига те да се различават по броя или типовете данни на параметрите си (подобно на методите)
  • 17.
    Индексатори class Song { // ... } classAlbum { // Частно поле за съхранение на песните private Song[] _songs; // Индексатор за достъпване на песните public Song this[int index] { // Блок за четене на елемент get { return _songs[index - 1]; } // Блок за записване на елемент set { _songs[index - 1] = value; } } } • Деклариране на индексатори – Модификатор за достъп – Тип данни на индексираните елементи – Ключова дума this – Списък от параметри, заградени в квадратни скоби – Блок, съдържащ get и/или set блок – Както и при свойствата, get и set блоковете може да са с различна видимост
  • 18.
    Деклариране на индексатори- демо // Демонстрация
  • 19.
    Индексатори Album album =new Album(11) { Artist = "Pearl Jam", Title = "Ten", }; // Записване на елемент по индекс album[1] = new Song { Title = "Once", }; album[2] = new Song { Title = "Even Flow", }; // Прочитане на елемент по индекс Console.WriteLine(album[1].Title); • Употреба на индексатори – Индексатор на обект се използва със същия синтаксис, както при индексиране на елемент в масив – Променлива или израз, който реферира обекта-колекция – Един или повече аргументи, заградени в квадратни скоби
  • 20.
    Употреба на индексатори- демо // Демонстрация
  • 21.
    Капсулиране чрез свойстваи индексатори • Свойствата и индексаторите „обличат“ поведението на обекта в по-удобни и по-интуитивни за употреба синтактични конструкции • Всичко, което може да се осъществи чрез свойство или индексатор, може да бъде реализирано и чрез обикновен(и) метод(и) • Препоръчва се употребата на свойства и индексатори, където е възможно/уместно
  • 22.
    Капсулиране чрез свойстваи индексатори - демо // Демонстрация
  • 23.
    Статични членове • Каквое „статичен член“ на клас/структура? – Не е обвързан с конкретен екземпляр на типа данни ,в който е деклариран – Обвързан е със самия тип данни – Достъпва се директно през типа данни – Декларира се подобно на обикновен (екземплярен) член, но се поставя ключовата дума static след модификатора за достъп
  • 24.
    Статични полета • Статичниполета – Съхраняват характеристики на класа, а не на конкретни негови екземпляри – За всяко статично поле се заделя единствено място в паметта, обвързано със самия клас – Константните полета са статични по подразбиране – Често се използват за съхраняване на помощна информация, от която се нуждаят екземплярите на класа
  • 25.
    Статични полета class Book { //Деклариране на статично поле за брой // инстанцирани обекти от тип Book public static int BookCount; // Деклариране на статично поле за глобален // масив от книги public static Book[] Books = new Book[100]; } • Деклариране на статични полета – Модификатор за достъп – Ключова дума static – Тип данни – Наименование (уникално измежду всички членове на класа, независимо дали са статични) – Стойност по подразбиране (незадължителна)
  • 26.
    Статични полета class Book { //... // Поле за номер на книга private int _bookNumber; // Екземплярен конструктор на класа public Book() { // Генериране на номера на новата книга _bookNumber = BookCount; // Вкарване на книгата в глобалния масив Books[BookCount] = this; // Увеличаване на броя книги с 1 BookCount++; } } // ... // Достъпване на списъка с книги в главната програма Book book = Book.Books[2]; • Използване на статични полета – Наименование на класа, в който е декларирано статичното поле – Оператор за достъп на член „.“ – Наименование на статичното поле – Могат да се достъпват директно в декларациите както на статичните, така и на екземплярните членове на класа – Не могат да се достъпват през екземпляр на класа (включително this)
  • 27.
    Статични полета -демо // Демонстрация
  • 28.
    Статични методи • Статичниметоди – Описват поведение, което не е обвързано с конкретен екземпляр на класа – Няма достъп до текущия екземпляр на класа (тъй като няма такъв) – не може да се използва ключовата дума this, нито могат да се достъпват пряко екземплярните членове на класа – Могат да се достъпват пряко статичните членове на класа – Много от стандартните методи, с които вече сте запознати, са статични – Главната програма на всяко приложение в C# на практика е статичен метод
  • 29.
    Статични методи class Book { //... // Статичен метод за отстраняване на книга // от глобалния масив public static void RemoveBook(int index) { // Проверка за валиден индекс на книга if (index < 0 || index >= BookCount) return; // Преместване на следващите книги назад for (int i = index; i < BookCount - 1; i++) { Books[i] = Books[i + 1]; Books[i]._bookNumber--; } // Намаляване на броя книги с 1 BookCount--; } } • Деклариране на статични методи – Модификатор за достъп – Ключова дума static – Тип данни на връщания резултат (или ключова дума void) – Наименование – Списък от параметри в кръгли скоби – Блок с операции (тяло) – В тялото не може да се използва ключовата дума this, нито да се достъпват директно екземплярни членове – Могат да се достъпват директно статични членове – Могат да се декларират методи с еднакви наименования и различни по брой или типове параметри
  • 30.
    Статични методи class Book { //... // Екземплярен метод за премахване на текущата // книга от глобалния масив public void RemoveFromList() { RemoveBook(_bookNumber); } } // Премахване на книги от списъка в главната програма Book.Books[3].RemoveFromList(); Book.RemoveBook(0); • Използване на статични методи – Наименование на класа, в който е декларирано статичният поле – Оператор за достъп на член „.“ – Наименование на статичния метод – Списък с аргументи в кръгли скоби – Могат да се достъпват директно в декларациите както на статичните, така и на екземплярните членове на класа – Не могат да се достъпват през екземпляр на класа (включително this)
  • 31.
    Статични методи -демо // Демонстрация
  • 32.
    Статични конструктори • Статичниконструктори – Описват поведение, което се изпълнява еднократно при инициализацията на класа – Удобни за инициализиране на статични полета – Могат да се достъпват статичните членове на класа – Програмистът не извиква статичните конструктори явно и няма контрол кога точно да бъдат изпълнени – Не приемат параметри – Като правило се изпълняват непосредствено преди първата употреба на съответния клас в програмата
  • 33.
    Статични конструктори class Book { //... // Статичен конструктор на класа static Book() { BookCount = 0; Books = new Book[100]; } } • Деклариране на статични конструктори – Не се поставя модификатор за достъп – Ключова дума static – Наименование на класа – Празни кръгли скоби (празен списък с параметри) – Блок с операции (тяло) – В тялото не може да се използва ключовата дума this, нито да се достъпват директно екземплярни членове – Могат да се достъпват директно статични членове
  • 34.
    Статични конструктори -демо // Демонстрация
  • 35.
    Статични свойства • Статичнисвойства – Представляват свойства, обвързани със самия клас, а не с конкретен негов екземпляр – Обвиват поведение, но за външния код се държат като статични полета – Удобни за обвиване на статични полета (например за отложено зареждане на стойността на статично поле или за капсулирането му) – Налице са всички възможности на екземплярните свойства, с описаните ограничения за статични методи
  • 36.
    Статични свойства class Book { //Частно статично поле за глобален масив от // книги private static Book[] _books = new Book[100]; // Публично свойство само за четене за // глобален масив от книги public static Book[] Books { get { return _books; } } // Автоматично генерирано статично свойство с // публичен достъп за брой инстанцирани обекти // от тип Book public static int BookCount { get; private set; } } • Деклариране на статични свойства – Модификатор за достъп – Ключова дума static – Тип данни – Наименование – Блок, съдържащ get и/или set блокове – В блоковете не може да се използва ключовата дума this, нито да се достъпват директно екземплярни членове – Могат да се достъпват директно статични членове – get и set блоковете може да имат различна видимост, както при екземплярните свойства – Могат да се създават автоматично генерирани статични свойства
  • 37.
    Статични свойства class Book { //... // Поле за номер на книга private int _bookNumber; // Екземплярен конструктор на класа public Book() { // Генериране на номера на новата книга _bookNumber = BookCount; // Вкарване на книгата в глобалния масив Books[BookCount] = this; // Увеличаване на броя книги с 1 BookCount++; } } // ... // Достъпване на списъка с книги в главната програма Book book = Book.Books[2]; • Използване на статични свойства – Наименование на класа, в който е декларирано статичното свойство – Оператор за достъп на член „.“ – Наименование на статичното свойство – Могат да се достъпват директно в декларациите както на статичните, така и на екземплярните членове на класа – Не могат да се достъпват през екземпляр на класа (включително this)
  • 38.
    Статични свойства -демо // Демонстрация
  • 39.
    Задачи за упражнение •Преработете програмите от предишните упражнения (геометрични фигури, библиотека и походова конзолна ролева игра), така че да се възползвате от новите възможности на езика, за които научихте: – Използвайте свойства и индексатори вместо методи, където е уместно, за да капсулирате обектите – Създайте статични методи за въвеждане на нов екземпляр на съответния клас от клавиатурата – Възползвайте се от статичните полета, конструктори и свойства, за да споделите информация между отделните екземпляри на един клас (например екземпляр на класа Random) – Изнесете поведението, което не е обвързано с конкретен екземпляр на класа, в статични методи
  • 40.
  • 41.
    Благодаря! • Александър Далемски –sasho@david.bg – Skype: musasho – https://facebook.com/adalemski • ДАВИД академия – acad@david.bg – http://acad.david.bg/ – @david_academy – https://facebook.com/DavidAcademy