- •Лекція 1 Вступ. Огляд парадигм та платформ для Web-розробки. Платформа asp.Net. Інструменти та інтегроване середовище розробки Visual Web Developer 2010.
- •1.1 Вступ. Поняття Інтернет. Базові концепції Всесвітньої павутини www. Еволюція Web
- •1.1.1 Поняття Інтернет
- •1.1.2 Базові концепції Всесвітньої павутини www
- •1.1.3 Еволюція Web
- •1.2 Огляд парадигм та платформ для Web-розробки
- •1.2.2 Найбільш поширені мови та технології розробки
- •1.3 Платформа asp.Net
- •1.3.1 Розвиток asp.Net
- •1.3.2 Ключові переваги asp.Net mvc
- •1.4 Інструменти та інтегроване середовище розробки Visual Web Developer 2010
- •1.4.3 Додаткові компоненти
- •1.4.4 Отримання допоміжної інформації від розробників
- •1 Анатомія html-документа
- •2 Текст
- •3 Гіперпосилання
- •4 Форматовані списки
- •5 Таблиці
- •6 Каскадні таблиці стилів
- •Лекція 3 Синтаксичні конструкції мови c#.
- •3.1Зв’язок між c# I .Net. Особливості платформи .Net
- •3.1.1 Загальномовне виконуюче середовище
- •3.1.2 Класи .Net Framework
- •3.1.3 Простори імен .Net
- •3.2Синтаксичні особливості c#
- •3.2.2 Визначені типи даних
- •3.2.3 Керування потоком виконання
- •3.2.4 Перерахування
- •3.2.5 Простори імен
- •3.2.6 Метод Main (). Консольний ввід-вивід. Коментарі.
- •3.3Об’єкти і типи
- •3.3.1 Класи
- •3.3.2 Структури
- •3.4Наслідування
- •3.4.1 Типи наслідування
- •3.4.2 Модифікатори доступу
- •3.4.3 Інтерфейси
- •3.5Узагальнення
- •3.6Операції
- •1 Колекції
- •2 Делегати
- •Лекція №5 Елементи керування на сторінках asp.Net
- •1. Структура web-додатку на основі asp.Net
- •2. Керування станом в asp.Net
- •3. Серверні елементи керування на сторінках asp.Net
- •3.1 Серверні веб-елементи управління
- •4. Сценарії обробки запитів
- •5. Життєвий цикл сторінки asp.Net
3.3.1 Класи
Дані та функції, оголошені усередині класу, відомі як члени класу. В офіційної термінології Microsoft робиться розходження між даними-членами та функціями-членами. На додаток до членів, класи можуть містити в собі вкладені типи (такі як інші класи). Доступність членів класу може бути описана як public, protected, internal protected, private або internal.
Дані-члени
Дані-члени - це ті члени, які містять дані класу - поля, константи, події. Дані-члени можуть бути статичними (static). Член класу є членом екземпляру, якщо тільки він не оголошений явно як static.
class PhoneCustomer
{
public const string DayOfSendingBill = "Monday";
public int CustomerlD;
public string FirstName;
public string LastName;
}
Поля (field) - це будь-які змінні, асоційовані з класом. Після створення екземпляру об'єкта до його полях можна звертатися з використанням синтаксису Об'єкт. ІмяПоля.
PhoneCustomer Customerl = new PhoneCustomer();
Customerl.FirstName = "Simon";
Константи можуть бути асоційовані з класом тим же способом, що і змінні. Константа оголошується за допомогою ключового слова const.
Події - це члени класу, що дозволяють об'єкту повідомляти код про те, що сталися якісь зміни, наприклад, зміна властивості класу або деяка взаємодія з користувачем. Клієнт може мати код, відомий як обробник подій, що реагує на них.
Функції-члени
Функції-члени - це члени, які забезпечують деяку функціональність для маніпулювання даними класу. Вони включають методи, властивості, конструктори, фіналізатори, операції та індексатори.
Методи (method) - це функції, асоційовані з певним класом. Як і дані-члени, за замовчуванням вони є членами примірника. Вони можуть бути оголошені статичними за допомогою модифікатора static.
Властивості (property) - це набори функцій, які можуть бути доступні клієнтові таким же способом, як загальнодоступні поля класу. У С # передбачений спеціальний синтаксис для реалізації читання і запису властивостей для класів, тому писати власні методи, що починаються на Set і Get, не знадобиться.
Конструктори (constructor) - це спеціальні функції, що викликаються автоматично при ініціалізації об'єкту. Їх імена збігаються з іменами класів, яким вони належать, і вони не мають типу повернення. Конструктори корисні для ініціалізації полів класу.
Фіналізатори (finalizer) схожі на конструктори, але викликаються, коли середовище CLR визначає, що об'єкт більше не потрібен. Вони мають те ж ім'я, що й клас, але з попереднім символом тильди (~). Передбачити точно, коли буде викликаний фіналізатор, неможливо.
Операції (operator) - це найпростіші дії начебто + або -. Коли ви складаєте два цілих числа, то, строго кажучи, застосовуєте операцію + до цілих. Однак С# дозволяє вказати, як існуючі операції будуть працювати з користувацькими класами (так звана перевантаження операцій).
Індексатори (indexer) дозволяють індексувати об'єкти таким же способом, як масив або колекцію.
Методи
Офіційна термінологія С # робить відмінність між функціями і методами. Згідно цієї термінології, поняття "функція-член" включає не тільки методи, але також інші члени, що не є даними, класу або структури. Сюди входять індексатори, операції, конструктори, деструктори, а також властивості.
У С # визначення методу складається з модифікаторів, типу значення, що повертається, за яким слідує ім'я методу, потім списку аргументів у круглих дужках і далі - тіла методу в фігурних дужках:
[модифікатори] тип_повернення ІмяМетода ([параметри])
{
/ / Тіло методу
}
Кожен параметр складається з імені типу параметра і імені, по якому до нього можна звернутися в тілі методу. До того ж, якщо метод повертає значення, то для вказівки точки виходу повинен використовуватися оператор повернення разом з повертаним значенням. Наприклад:
public bool IsSquare (Rectangle rect)
{
return (rect.Height == rect.Width);
}
Для виклику статичних методів необхідно ввести ім’я класу, що містить метод, та ім’я самого методу, і вказати в дужках усі необхідні параметри:
Console.WriteLine ("Pi рівне " + MathTest.GetPi ());
int x = MathTest.GetSquareOf(5);
Нестатичні методи викликаються для конкретних екземплярів класів. Для виклику нестатичних методів необхідно ввести ім’я конкретного екземпляру, та ім’я самого методу:
MathTest math = new MathTest ();
math.value = 30;
Console.WriteLine("Поле value змінної math містить" + math.value);
Console.WriteLine("30 в квадрате дорівнює" + math.GetSquare());
Якщо метод не повертає нічого, то в якості типу повернення вказується void, оскільки взагалі опустити тип повернення неможливо. Якщо ж він не приймає аргументів, то все одно після імені методу повинні бути присутніми порожні круглі дужки.
С # поширює вимогу ініціалізації на параметри, передані методом. Будь-яка змінна повинна бути ініціалізована перш, ніж вона буде передана в метод, незалежно від того, передається вона за значенням чи посиланням. Зазвичай параметри повинні передаватися в метод в тому ж порядку, в якому вони визначені. Іменовані аргументи дозволяють передавати параметри в будь-якому порядку. Параметри також можуть бути необов'язковими. Для таких параметрів повинні визначатися значення за замовчуванням. Необов'язкові параметри повинні розташовуватися останніми в списку.
Перегрузка методів
У С # підтримується перевантаження методів - може існувати кілька версій методу з різними сигнатурами (тобто ім'ям, кількістю та/або типами параметрів). Щоб перевантажити методи, потрібно просто оголосити методи з однаковими іменами, але різними з різною кількістю або типами параметрів:
class ResultDisplayer
{
void DisplayResult (string result)
{
//Реалізація
}
void DisplayResult (int result)
{
//Реалізація
}
}
С # забезпечує деякий мінімальний захист щодо параметрів перевантажених методів:
недостатньо, щоб два методи відрізнялися тільки типом значення, що повертається;
недостатньо, щоб два методи відрізнялися тільки специфікацією параметрів ref і out.
Властивості
Ідея властивості полягає в методі або парі методів, які ведуть себе з точки зору клієнтського коду як поле.
Для визначення властивості на С # використовується наступний синтаксис:
public string SomeProperty
{
get
{
return "Це значення властивості";
}
set
{
//Зробити все необхідне для установки властивості
}
}
Засіб доступу get не приймає ніяких параметрів і має повертати значення того типу, що оголошений для властивості. Для засоби доступу set не повинні вказуватися явні параметри, але компілятор припускає, що воно приймає один параметр по імені value, що відноситься до того ж типу.
Існує можливість створити властивість, доступну тільки для читання, просто виключаючи set з визначення властивості. Точно так само можна визначити властивість, доступну тільки для запису, якщо виключити визначення get, однак в таких випадках краще замість властивості використати метод.
Мова С # допускає застосування різних модифікаторів доступу для засобів set і get властивостей. Це дає можливість властивості мати загальнодоступний get і приватний або захищений set, і управляти тим, як і коли властивість може бути встановлено. Один із засобів доступу - set або get - повинен мати рівень доступу властивості. Якщо get також буде мати асоційований з ним захищений рівень доступу, то компілятор згенерує помилку, оскільки в цьому випадку і set, і get отримують рівень доступу, відмінний від рівня доступу самої властивості.
Якщо наявність деякої логіки в методах set і get властивості не передбачається, можна використовувати автоматично реалізовані властивості. Такі властивості створюють підтримуючі їх змінні-члени автоматично.
public int Age {get; set;}
В оголошенні private int age; немає необхідності - компілятор створить його автоматично. При використанні автоматично реалізованих властивостей перевірка достовірності властивості не може бути виконана в його методі set. Також повинні бути присутніми обидва методи доступу. Однак рівень доступу кожного методу доступу може бути різним. Тому наступний код є допустимим:
public int Age {get; private set;}
Конструктори
Синтаксис оголошення базових конструкторів виглядає як оголошення методу, який має те ж ім'я, що й включаючий його клас, і не має ніякого типу повернення:
public class MyClass
{
public MyClass ()
{
}
//Залишок визначення класу
Передбачати конструктор в класі не обов'язково. У загальному випадку, якщо ніякий конструктор не визначений, то компілятор просто створить конструктор за умовчанням "за лаштунками". Це буде конструктор дуже узагальненого вигляду, який просто ініціалізує всі поля-члени, обнуляючи їх (null-посилання для посилальних типів, 0 для числових типів і false – для булівских). Конструктори підкоряються тим же правилам перегрузки, що і звичайні методи (тобто можна визначати стільки перевантажень конструктора, скільки необхідно, за умови, що вони будуть відрізнятися сигнатурою):
public MyClass () / / конструктор без параметрів
{
/ / Код конструктора
}
public MyClass (int number) / / інша перегрузка
{
/ / Код конструктора
}
Однак зверніть увагу, що якщо застосовується будь-який конструктор з параметрами, то в цьому випадку компілятор не генерує ніякого конструктора за замовчуванням. Такий конструктор генерується тільки тоді, коли жодного конструктора явно не визначено.
Щоб відрізняти поля класу від параметрів з тими ж іменами, використовується ключове слово this.
Статичні конструктори
Одним з нових засобів С # є можливість написання статичних конструкторів класу без параметрів. Такий конструктор виконується лише одного разу, на противагу всім іншим конструкторам, які є конструкторами екземплярів і виконуються при кожному створенні об'єктів класів.
class MyClass
{
static MyClass ()
{
/ / Код ініціалізації
}
/ / Залишок визначення класу
}
Однією з причин для написання статичного конструктора може бути наявність у класі деяких статичних полів або властивостей, які мають бути ініціалізовані зовнішнім джерелом, перш ніж клас буде використаний вперше. Статичний конструктор буде запущений максимум один раз і він буде викликаний до будь-якого першого звернення до даного класу. Повинно бути очевидним також, що статичний конструктор може мати доступ тільки до статичних членів класу, але не членів екземпляру. В класі допускається визначати одночасно статичний конструктор і конструктор екземпляру без параметрів. Хоча їх списки параметрів ідентичні, не виникає ніякого конфлікту, тому що статичний конструктор виконується під час завантаження класу, а конструктор примірника - при створенні екземпляру. Якщо є більше одного класу зі статичним конструктором, то невідомо, який із статичних конструкторів буде викликаний першим. Тому в статичний конструктор не повинен поміщатися код, який би залежав від того, були чи не були викликані раніше інші статичні конструктори.
Поля readonly
Іноді може знадобитися змінна, яка не повинна бути змінена, але чиє значення не відомо до моменту запуску програми. Для таких випадків в С# передбачений інший тип змінних: поля readonly.
Ключове слово readonly забезпечує трохи більшу гнучкість, ніж const, надаючи можливість мати константне поле, для знаходження початкового значення якого потрібні деякі обчислення. Правило використання таких полів свідчить,що можна присвоювати їм значення тільки в конструкторі і ніде більше. Також поле readonly може належати екземпляру, а не бути статичним, і тому мати різні значення в різних екземплярах класу. Це означає, що на відміну від полів const, щоб зробити поле readonly статичним, то треба явно оголосити його таким.
Часткові класи
Ключове слово partial (частковий) дозволяє визначити клас, структуру або інтерфейс, розподілений по декількох файлах. Коли безлічі розробників потрібен доступ до одного і того ж класу, або ж в ситуації, коли деякий генератор коду генерує частину класу, такий поділ класу на декілька файлів може виявитися корисним.
Ключове слово partial просто поміщається перед класом, структурою або інтерфейсом.
//BigClassPartl.сs
partial class TheBigClass
{
public void MethodOne(); { }
}
//BigClassPart2.cs
partial class TheBigClass
{
public void MethodTwo();{ }
}
Коли компілюється проект, частиною якого є ці два файла, створюється єдиний тип TheBigClass з двома методами - MethodOne () і MethodTwo ().
Вкладені частини також допускаються, до тих пір, поки ключове слово partial передує ключовому слову class у вкладеному типі. Атрибути, XML-коментарі, інтерфейси, параметри узагальнених типів і члени всіх частин часткового класу компілюються в єдиний тип.
Статичні класи
Якщо клас не містить нічого, крім статичних методів і властивостей, цей клас сам по собі може стати статичним. Статичний клас функціонально являє собою те ж саме, що і клас з приватним статичним конструктором. Створити екземпляр такого класу неможливо. Якщо вказати ключове слово static в оголошенні класу, компілятор буде гарантувати, що до цього класу ніколи не будуть додані нестатичні члени. Це гарантує також, що екземпляри цього класу ніколи не будутьстворені. Синтаксис оголошення статичного класу виглядає наступним чином:
static class StaticUtilities
{
public static void HelperMethod (){ }
}
Клас Object
Всі класи .NET спочатку успадковані від System.Object. Фактично, якщо при визначенні нового класу базовий клас не зазначений, компілятор автоматично припускає, що він успадковується від Object.
Практичне значення цього в тому, що крім методів і властивостей, які визначаються, також з'являється доступ до безлічі загальнодоступних і захищених методів-членів, які визначені в класі Object. Ці методи присутні у всіх визначуваних класах.
Методи System.Object
ToString(). Цей метод призначений для видачі базового, швидкого і простого строкового представлення.
GetHashCode(). Цей метод використовується, коли об'єкт поміщається в структуру даних, яка називається хеш-таблицею. Застосовується класами, які маніпулюють цими структурами, щоб визначити, куди саме в структуру повинен бути поміщений об'єкт.
Equals() (обидві версії) і ReferenceEquals(). Враховуючи існування трьох різних методів порівняння об'єктів, середовище .NET використовує досить складну схему визначення еквівалентності об'єктів. Слід враховувати і використовувати тонкі відмінності між цими трьома методами і операцією порівняння ==.
Finalize(). Його призначення в С# приблизно відповідне деструкторам C++, і він викликається при збірці сміття для очищенняресурсів, зайнятих об'єктом. Зазвичай перевизначати Finalize() необхідно, якщо об'єкт володіє некерованими ресурсами, які потрібно звільнити при його знищенні.
GetType(). Цей метод повертає екземпляр класу, успадкований від System.Туре. Цей об'єкт може надати великий обсяг інформації про клас,членом якого є ваш об'єкт, включаючи базовий тип, методи, властивості і т.п.
MemberwiseClone (). Цей метод просто створює копію об'єкту і повертає посилання на цю копію (а в разі типу значення - посилання на упаковку). При цьому виконується неглибоке копіювання, тобто копіюються всі типи значень в класі. Якщо ж клас включає в себе члени типів посилань, то копіюються тільки посилання, а не об'єкти, на які вони вказують.
Розширюючі методи
Розширюючі методи (extension method) - це статичні методи, які можуть стати частиною класу, коли вихідний код цього класу не доступний.
Для розширюючого методу першим параметром завжди повинен бути тип, який підлягає розширенню, попереджений ключовим словом this. В розширюючому методі можна звертатися до загальнодоступних методів і властивостей розширюваного типу.
Незважаючи на те що розширюючий метод є статичним, можна використовувати стандартний синтаксис методу екземпляра. Якщо ім'я розширюючого методу співпаде з ім'ям вже існуючого методу класу, то розширюючий метод ніколи не буде викликаний. Будь-які методи екземпляру, наявні в класі, мають перевагу.
namespace Wrox
{
public static class MoneyExtension
{
public static void AddToAmount(this Money money, decimal amountToAdd)
{
money.Amount += amountToAdd;
}
}
}
