2013
Курс по програмиране на C#
Занятие №10
Свойства. Индексатори. Статични членове
Съдържание
• Свойства
• Индексатори
• Капсулиране със свойства и индексатори
• Статични членове
• Статични полета
• Статич...
Свойства
• Какво е „свойство“?
– Вид член на клас
– Описва поведение на класа
– За външния код изглежда като характеристик...
Свойства
• Деклариране на свойства
– Както повечето членове, свойствата имат видимост
– Тип данни
– Уникално наименование ...
Свойства
class Animal
{
// Частно поле за съхраняване на данните
private string _species;
// Свойство за капсулиране на да...
Деклариране на свойства - демо
// Демонстрация
Свойства
Animal cat = new Animal();
// Присвояване на стойност на свойство
cat.Species = "Felis silvestris catus";
// Проч...
Употреба на свойства - демо
// Демонстрация
Свойства
class User
{
private string _userName;
private bool _isLocked;
// Свойство само за четене
public string UserName
...
Свойства само за четене и свойства само за запис -
демо
// Демонстрация
Свойства
class Shape2D
{
private double _area;
public double Area
{
// Публичен достъп за четене
get { return _area; }
// ...
Свойства с различна видимост на get и set блоковете -
демо
// Демонстрация
Свойства
class Building
{
// Ръчно капсулирано със свойство поле
private double _height;
public double Height
{
get { retu...
Автоматично генерирани свойства - демо
// Демонстрация
Индексатори
• Какво е „индексатор“?
– Вид член на клас
– Описва поведение на класа
– Служи за достъпване на елемент по пор...
Индексатори
• Деклариране на индексатори
– Както повечето членове, индексаторите имат видимост
– Няма наименование
– Тип д...
Индексатори
class Song
{
// ...
}
class Album
{
// Частно поле за съхранение на песните
private Song[] _songs;
// Индексат...
Деклариране на индексатори - демо
// Демонстрация
Индексатори
Album album = new Album(11)
{
Artist = "Pearl Jam",
Title = "Ten",
};
// Записване на елемент по индекс
album[...
Употреба на индексатори - демо
// Демонстрация
Капсулиране чрез свойства и индексатори
• Свойствата и индексаторите „обличат“ поведението на
обекта в по-удобни и по-инту...
Капсулиране чрез свойства и индексатори - демо
// Демонстрация
Статични членове
• Какво е „статичен член“ на клас/структура?
– Не е обвързан с конкретен екземпляр на типа данни ,в който...
Статични полета
• Статични полета
– Съхраняват характеристики на класа, а не на конкретни негови
екземпляри
– За всяко ста...
Статични полета
class Book
{
// Деклариране на статично поле за брой
// инстанцирани обекти от тип Book
public static int ...
Статични полета
class Book
{
// ...
// Поле за номер на книга
private int _bookNumber;
// Екземплярен конструктор на класа...
Статични полета - демо
// Демонстрация
Статични методи
• Статични методи
– Описват поведение, което не е обвързано с конкретен екземпляр
на класа
– Няма достъп д...
Статични методи
class Book
{
// ...
// Статичен метод за отстраняване на книга
// от глобалния масив
public static void Re...
Статични методи
class Book
{
// ...
// Екземплярен метод за премахване на текущата
// книга от глобалния масив
public void...
Статични методи - демо
// Демонстрация
Статични конструктори
• Статични конструктори
– Описват поведение, което се изпълнява еднократно при
инициализацията на кл...
Статични конструктори
class Book
{
// ...
// Статичен конструктор на класа
static Book()
{
BookCount = 0;
Books = new Book...
Статични конструктори - демо
// Демонстрация
Статични свойства
• Статични свойства
– Представляват свойства, обвързани със самия клас, а не с
конкретен негов екземпляр...
Статични свойства
class Book
{
// Частно статично поле за глобален масив от
// книги
private static Book[] _books = new Bo...
Статични свойства
class Book
{
// ...
// Поле за номер на книга
private int _bookNumber;
// Екземплярен конструктор на кла...
Статични свойства - демо
// Демонстрация
Задачи за упражнение
• Преработете програмите от предишните упражнения
(геометрични фигури, библиотека и походова конзолна...
Въпроси?
Благодаря!
• Александър Далемски
– sasho@david.bg
– Skype: musasho
– https://facebook.com/adalemski
• ДАВИД академия
– aca...
Upcoming SlideShare
Loading in …5
×

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

376 views

Published on

Училищен курс по програмиране на C# (2013/2014)
Занятие №10: Свойства. Индексатори. Статични членове

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
376
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

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

×