41
2013 Copyright © 2013 DAVID Holding Company Курс по програмиране на C# Занятие №10 Свойства. Индексатори. Статични членове

Курс по програмиране на C#

  • Upload
    aya

  • View
    90

  • Download
    4

Embed Size (px)

DESCRIPTION

Курс по програмиране на C#. Занятие №10 Свойства. Индексатори. Статични членове. Съдържание. Свойства Индексатори Капсулиране със свойства и индексатори Статични членове Статични полета Статични методи Статични конструктори Статични свойства. Свойства. Какво е „свойство“? - PowerPoint PPT Presentation

Citation preview

Page 1: Курс по програмиране на C#

2013Copyright © 2013 DAVID Holding Company

Курс по програмиране на C#Занятие №10

Свойства. Индексатори. Статични членове

Page 2: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Съдържание• Свойства• Индексатори• Капсулиране със свойства и индексатори• Статични членове• Статични полета• Статични методи• Статични конструктори• Статични свойства

Page 3: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Свойства• Какво е „свойство“?– Вид член на клас– Описва поведение на класа– За външния код изглежда като характеристика– Служи за изпълнение на операции при прочитането или

присвояването на стойност на характеристика на обект– Заменя аксесорите и мутаторите при капсулиране на класа– Може да се използва за реализиране на характеристика, която

не се съхранява в поле на обекта, а може да бъде изчислена посредством други вътрешни данни на обекта

Page 4: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Свойства• Деклариране на свойства– Както повечето членове, свойствата имат видимост– Тип данни– Уникално наименование в рамките на класа– Блок с операции, които да се изпълнят при прочитане на

стойността на свойството; задължително трябва да бъде върнат резултат от указания тип

– Блок с операции, които да се изпълнят при присвояване на стойност на свойството; присвоената стойност се достъпва члез стандартната дума value, която играе ролята на параметър

– Един от двата блока може да бъде пропуснат: свойства само за четене или свойства само за запис

Page 5: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Свойства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

Page 6: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Деклариране на свойства - демо// Демонстрация

Page 7: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

СвойстваAnimal cat = new Animal();// Присвояване на стойност на свойствоcat.Species = "Felis silvestris catus";// Прочитане на стойността на свойствоConsole.WriteLine(cat.Species);// Присвояване на стойност при инстанциране// на обект с инициализацияAnimal dog = new Animal{ Species = "Canis lupus familiaris",};

• Употреба на свойства– Стойността на свойство се достъпва

по същия начин, както и тази на поле– Израз, рефериращ обекта– Оператор за достъпване на член „.“– Наименование на свойството– Фундаменталната разлика е в това,

че съответната прочетена или присвоена стойност не е задължително да се пази в паметта на обекта

Page 8: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Употреба на свойства - демо// Демонстрация

Page 9: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Свойстваclass User{ private string _userName; private bool _isLocked; // Свойство само за четене public string UserName { get { return _userName; } } // Свойство само за запис public bool IsLocked { set { _isLocked = value; } }}

• Деклариране на свойства само за четене– Декларира се само get блок– Компилаторът не разрешава

присвояване на стойност на свойството

• Деклариране на свойство само за запис– Декларира се само set блок– Компилаторът не разрешава

прочитане на стойността на свойството

Page 10: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Свойства само за четене и свойства само за запис - демо

// Демонстрация

Page 11: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Свойстваclass Shape2D{ private double _area; public double Area { // Публичен достъп за четене get { return _area; } // Защитен достъп за запис protected set { if (value > 0.0) _area = value; } }}

• Свойства с различна видимост на get и set блоковете– Пред един от get и set блоковете

може да се постави модификатор за достъп

– Видимостта на съответния блок трябва да е по-ограничена от видимостта на цялото свойство

Page 12: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Свойства с различна видимост на get и set блоковете - демо

// Демонстрация

Page 13: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Свойства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 блоковете

Page 14: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Автоматично генерирани свойства - демо// Демонстрация

Page 15: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Индексатори• Какво е „индексатор“?– Вид член на клас– Описва поведение на класа– Служи за достъпване на елемент по пореден номер или друг/и

параметър/ри, подобно на елементите на масив, чрез оператора за индексиране на елемент []

– Удобен за реализиране на класове, които представляват колекции от елементи

Page 16: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Индексатори• Деклариране на индексатори– Както повечето членове, индексаторите имат видимост– Няма наименование– Тип данни на елементите, които се индексират– Списък от параметри (поне един)– Блокове от операции за четене и/или записване на стойност на

съответния елемент – подобно на свойство– В един клас може да се декларират няколко индексатора, стига

те да се различават по броя или типовете данни на параметрите си (подобно на методите)

Page 17: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Индексатори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

блоковете може да са с различна видимост

Page 18: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Деклариране на индексатори - демо// Демонстрация

Page 19: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Индексатори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);

• Употреба на индексатори– Индексатор на обект се използва със

същия синтаксис, както при индексиране на елемент в масив

– Променлива или израз, който реферира обекта-колекция

– Един или повече аргументи, заградени в квадратни скоби

Page 20: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Употреба на индексатори - демо// Демонстрация

Page 21: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Капсулиране чрез свойства и индексатори• Свойствата и индексаторите „обличат“ поведението на

обекта в по-удобни и по-интуитивни за употреба синтактични конструкции

• Всичко, което може да се осъществи чрез свойство или индексатор, може да бъде реализирано и чрез обикновен(и) метод(и)

• Препоръчва се употребата на свойства и индексатори, където е възможно/уместно

Page 22: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Капсулиране чрез свойства и индексатори - демо// Демонстрация

Page 23: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични членове• Какво е „статичен член“ на клас/структура?– Не е обвързан с конкретен екземпляр на типа данни ,в който е

деклариран– Обвързан е със самия тип данни– Достъпва се директно през типа данни– Декларира се подобно на обикновен (екземплярен) член, но се

поставя ключовата дума static след модификатора за достъп

Page 24: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични полета• Статични полета– Съхраняват характеристики на класа, а не на конкретни негови

екземпляри– За всяко статично поле се заделя единствено място в паметта,

обвързано със самия клас– Константните полета са статични по подразбиране– Често се използват за съхраняване на помощна информация, от

която се нуждаят екземплярите на класа

Page 25: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични полетаclass Book{ // Деклариране на статично поле за брой // инстанцирани обекти от тип Book public static int BookCount; // Деклариране на статично поле за глобален // масив от книги public static Book[] Books = new Book[100];}

• Деклариране на статични полета– Модификатор за достъп– Ключова дума static– Тип данни– Наименование (уникално измежду

всички членове на класа, независимо дали са статични)

– Стойност по подразбиране (незадължителна)

Page 26: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични полетаclass Book{ // ... // Поле за номер на книга private int _bookNumber; // Екземплярен конструктор на класа public Book() { // Генериране на номера на новата книга _bookNumber = BookCount; // Вкарване на книгата в глобалния масив Books[BookCount] = this; // Увеличаване на броя книги с 1 BookCount++; }}// ...// Достъпване на списъка с книги в главната програмаBook book = Book.Books[2];

• Използване на статични полета– Наименование на класа, в който е

декларирано статичното поле– Оператор за достъп на член „.“– Наименование на статичното поле– Могат да се достъпват директно в

декларациите както на статичните, така и на екземплярните членове на класа

– Не могат да се достъпват през екземпляр на класа (включително this)

Page 27: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични полета - демо// Демонстрация

Page 28: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични методи• Статични методи– Описват поведение, което не е обвързано с конкретен

екземпляр на класа– Няма достъп до текущия екземпляр на класа (тъй като няма

такъв) – не може да се използва ключовата дума this, нито могат да се достъпват пряко екземплярните членове на класа

– Могат да се достъпват пряко статичните членове на класа– Много от стандартните методи, с които вече сте запознати, са

статични– Главната програма на всяко приложение в C# на практика е

статичен метод

Page 29: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични методи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, нито да се достъпват директно екземплярни членове

– Могат да се достъпват директно статични членове

– Могат да се декларират методи с еднакви наименования и различни по брой или типове параметри

Page 30: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични методиclass Book{ // ... // Екземплярен метод за премахване на текущата // книга от глобалния масив public void RemoveFromList() { RemoveBook(_bookNumber); }}// Премахване на книги от списъка в главната програмаBook.Books[3].RemoveFromList();Book.RemoveBook(0);

• Използване на статични методи– Наименование на класа, в който е

декларирано статичният поле– Оператор за достъп на член „.“– Наименование на статичния метод– Списък с аргументи в кръгли скоби– Могат да се достъпват директно в

декларациите както на статичните, така и на екземплярните членове на класа

– Не могат да се достъпват през екземпляр на класа (включително this)

Page 31: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични методи - демо// Демонстрация

Page 32: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични конструктори• Статични конструктори– Описват поведение, което се изпълнява еднократно при

инициализацията на класа– Удобни за инициализиране на статични полета– Могат да се достъпват статичните членове на класа– Програмистът не извиква статичните конструктори явно и няма

контрол кога точно да бъдат изпълнени– Не приемат параметри– Като правило се изпълняват непосредствено преди първата

употреба на съответния клас в програмата

Page 33: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични конструкториclass Book{ // ... // Статичен конструктор на класа static Book() { BookCount = 0; Books = new Book[100]; }}

• Деклариране на статични конструктори– Не се поставя модификатор за достъп– Ключова дума static– Наименование на класа– Празни кръгли скоби (празен списък с

параметри)– Блок с операции (тяло)– В тялото не може да се използва

ключовата дума this, нито да се достъпват директно екземплярни членове

– Могат да се достъпват директно статични членове

Page 34: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични конструктори - демо// Демонстрация

Page 35: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични свойства• Статични свойства– Представляват свойства, обвързани със самия клас, а не с

конкретен негов екземпляр– Обвиват поведение, но за външния код се държат като

статични полета– Удобни за обвиване на статични полета (например за отложено

зареждане на стойността на статично поле или за капсулирането му)

– Налице са всички възможности на екземплярните свойства, с описаните ограничения за статични методи

Page 36: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични свойства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 блоковете може да имат различна видимост, както при екземплярните свойства

– Могат да се създават автоматично генерирани статични свойства

Page 37: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични свойстваclass Book{ // ... // Поле за номер на книга private int _bookNumber; // Екземплярен конструктор на класа public Book() { // Генериране на номера на новата книга _bookNumber = BookCount; // Вкарване на книгата в глобалния масив Books[BookCount] = this; // Увеличаване на броя книги с 1 BookCount++; }}// ...// Достъпване на списъка с книги в главната програмаBook book = Book.Books[2];

• Използване на статични свойства– Наименование на класа, в който е

декларирано статичното свойство– Оператор за достъп на член „.“– Наименование на статичното

свойство– Могат да се достъпват директно в

декларациите както на статичните, така и на екземплярните членове на класа

– Не могат да се достъпват през екземпляр на класа (включително this)

Page 38: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Статични свойства - демо// Демонстрация

Page 39: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Задачи за упражнение• Преработете програмите от предишните упражнения

(геометрични фигури, библиотека и походова конзолна ролева игра), така че да се възползвате от новите възможности на езика, за които научихте:– Използвайте свойства и индексатори вместо методи, където е

уместно, за да капсулирате обектите– Създайте статични методи за въвеждане на нов екземпляр на

съответния клас от клавиатурата– Възползвайте се от статичните полета, конструктори и

свойства, за да споделите информация между отделните екземпляри на един клас (например екземпляр на класа Random)

– Изнесете поведението, което не е обвързано с конкретен екземпляр на класа, в статични методи

Page 40: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Въпроси?

Page 41: Курс по програмиране на C#

Copyright © 2013 DAVID Holding Company

Благодаря!• Александър Далемски– [email protected]– Skype: musasho– https://facebook.com/adalemski

• ДАВИД академия– [email protected]– http://acad.david.bg/– @david_academy– https://facebook.com/DavidAcademy