69074

Огляд мови програмування С# (частина 2) Клас та структури

Лекция

Информатика, кибернетика и программирование

В рамках оголошення класу та структури описується безліч змінних різних типів набір данихчленів класу правила породження об’єктів-представників структур і класів їх основні властивості і методи застосування яких забезпечує вирішення задачі.

Украинкский

2014-09-29

185.5 KB

3 чел.

PAGE   \* MERGEFORMAT 1

Лекція №6 Огляд мови програмування С# (частина 2)

Клас та структури

Класи та структури є типами, які програмно визначаються. Вони дозволяють створювати нові типи, спеціально пристосовані для вирішення конкретних завдань. В рамках оголошення класу та структури описується безліч змінних різних типів (набір даних-членів класу), правила породження об'єктів-представників структур і класів, їх основні властивості і методи, застосування яких забезпечує вирішення задачі.

У програмі клас оголошується за допомогою спеціальної синтаксичної конструкції, яка називається оголошенням класу. Фактично, оголошення структур і класів є основним елементом будь-якої C#-програми. У програмі немає нічого, крім оголошень класів і конструкцій, що полегшують процедуру цього оголошення.

З точки зору синтаксису, між оголошеннями класів і структур існує незначні відмінності (ключове слово struct та class, в структурі не допускається оголошень членів класу зі специфікатором доступу protected, protected internal, особливості оголошення конструкторів – не допускається оголошення конструктора без параметрів), частина з яких буде обговорюватися далі.

<Слайд 46>Синтаксис оголошення класу:

[ атрибути ] [ специфікатори ] class ім’я_класу [ : предки ] тіло_класу

Оголошення класу складається з кількох елементів:

  •  оголошення атрибутів – необов'язковий елемент оголошення;
  •  специфікатори прав доступу – необов'язковий елемент оголошення;
  •  class (struct для структури);
  •  ім'я класу задається за загальними правилами;
  •  імена предків (класу і інтерфейсів) – необов'язковий елемент оголошення;
  •  тіло класу (структури) – список описів його елементів, розташований у фігурних дужках.

Атрибути є засобом додавання декларативної (допоміжної) інформації до елементів програмного коду. Призначення атрибутів: організація взаємодії між програмними модулями, додаткова інформація про умови виконання коду, керування сериализацією (правила збереження інформації), відлагодження, тощо.

<Слайд 47>Специфікатори визначають властивості класу, а також доступність класу для інших елементів програми. Специфікатори прав доступу – засіб реалізації принципу інкапсуляції, використовуються при оголошенні класів, структур та їх складових компонентів. Перелік специфікаторів наведено на наступному слайді:

Специфікатор

Опис

new

Використовується для вкладених класів. Задає новий опис класу замість успадкованого від предка. Застосовується в ієрархіях 

public

Доступ не не обмежений

protected

Використовується для вкладених класів. Доступ лише з елементів даного та похідних класів

internal

Доступ лише з даної програми (збірки)

protected internal

Доступ лише з даного та похідних класів або з даної програми (збірки)

private

Використовується для вкладених класів. Доступ лише з елементів класу, всередині якого описаний даний клас

abstract

Абстрактний клас. Застосовується в ієрархіях 

sealed

Бесплідний клас. Застосовується в ієрархіях 

static

Статичний клас. Введений у версію мови 2.0.

Поєднання ключового слова class та імені оголошуваного класу задає ім'я оголошуваного типу як класу (struct ІМ'Я задає ім'я структури).

Конструкції виду

ім'я класу: перелік імен інтерфейсів

з обов'язковим роздільником «забезпечують реалізацію принципу успадкування та будуть обговорюватися пізніше. Тіло класу в оголошенні обмежується парою роздільників «{», «}», між якими розташовуються оголошення даних-членів і методів класу.

<Слайд 48>Наступний приклад демонструє використання основних елементів оголошення класу. При оголошенні класу допускається лише один специфікатор public (тут він опущений). Відсутність специфікатору доступу в оголошеннях членів класу (структури) еквівалентно явній вказівці специфікатору private.

// Перша програма на C#

namespace DemoApp // Оголошення власного простору імен. Початок

{

   //  Оголошення класу

   class Program

   {   // Тіло класу. Початок

       // Оголошення даних-членів

       protected int a = 0;

       // Статичний метод. Точка входу

       static void Main(string[] args)

       {

           // Тіло методу: тут розташовується программный код,

           // що визначає функціональність класу

           string answer;

           Console.WriteLine("\nHello, world! How are you?");

           answer = Console.ReadLine();

       }

   }   // Тіло класу. Кінець

} // Оголошення власного простору імен. Кінець

У мові C# клас – це тип даних. Але з іншого боку клас може виступати як архітектурна одиниця побудови програмної системи. Такий клас оголощується з модифікатором static. В ньому можуть бути задані константи, лише статичні поля і лише статичні методи. У нього немає конструкторів в звичайному сенсі цього слова, що дозволяють створювати об'єкти – екземпляри класу.

Приклад – клас Program консольної програми зі статичним методом Main.

<Слайд 49> Об'єкти

  •  Клас є узагальненим поняттям, що визначає характеристики і поведінку безлічі конкретних об'єктів цього класу, званих екземплярами (об'єктами) класу.
  •  Об'єкти створюються явним або неявним чином (програмістом або системою). Програміст створює екземпляр класу за допомогою операції new():

           Demo x = new Demo();    // створення екземпляру класу Demo

  •  Для кожного об'єкта при його створенні у пам'яті виділяється окрема область для зберігання його даних.
  •  Крім того, клас може містити статичні елементи, які існують в єдиному екземплярі для всіх об'єктів класу.
  •  Функціональні елементи класу завжди зберігаються в єдиному екземплярі.

Клас – це тип даних, який задає реалізацію деякої абстракції даних, характерної для проблемної області, для якої створюється програмна система.

Склад класу як типу даних визначається тією абстракцією даних, яку повинен реалізувати клас.

Об'єкти є екземплярами класу. Це динамічні об'єкти, вони створюються за допомогою оператора new при виконанні програми та знищуються після виходу з неї.

В С# оголошення класів вводяться ключовим словом class.

Клас є основою для створення об'єктів. В класі визначаються дані і код, який працює з цими даними.

Методи і змінні, що складають клас, називаються членами класу. При визначенні класу оголошуються змінні, які він містить і код, який працює з цими змінними. Безпосередньо ініціалізація змінних в об'єкті (змінних екземпляра) виконується у конструкторі.

Членами класу можуть бути:

• Константи (const)

• Поля (field)

• Конструктори (у тому числі без параметрів)

• Деструктори

• Методи

• Властивості (property)

• Індексатори (властивості з параметрами)

• Події (event)

• Вкладені типи.

<Слайд 51>Поля та константи

Програма на мові C# складається з класів, усередині яких описують методи та дані. Дані, що містяться у класі, можуть бути змінними або константами.

Змінні, описані безпосередньо усередині класу, називаються полями класу. При описі полів можна вказувати атрибути та специфікатори, що задають різні характеристики елементів:

[атрибути] [специфікатори] [ const ] тип ім’я [ = початкове_значення ]

Всім полям автоматично призначається так зване "значення за промовчанням" – як правило, це 0 відповідного типу (наприклад, полям типу int присвоюється 0, а посиланням на об'єкти – значення null). Змінні, описані усередині методу класу, називаються локальними змінними. Їх ініціалізація покладається на програміста.

Звернення до поля класу виконується за допомогою операції доступу (крапка). Праворуч від крапки задається ім'я поля, зліва — ім'я екземпляра для звичайних полів або ім'я класу для статичних. Створення об’єкту класу  виконується оператором new. Синтаксис оператора new:

Ім’я_класу об’єкт = new Ім’я_класу();   

<Слайд 52>Специфікатори полей та констант класу наведені у наступній таблиці:

Специфікатор 

Опис 

new

Новий опис поля, що приховує успадкований элемент класса

public

Доступ до елементу не обмежений

protected

Доступ тільки з даного та похідних класів

internal

Доступ тільки з даної збірки

protected internal

Доступ тільки з даного і похідних класів і з даної збірки

private

Доступ тільки з даного класу

static

Поле належить класу в цілому, а не об’єктам даного класу 

readonly

Поле може бути ініціалізованим тільки у конструкторі класу

volatile

Поле может бути зміненим іншим процесом або операційною системою

<Слайд 53>У наступному прикладі визначається простий клас Demo і два способи звернення до його полів:

namespace Example

{

   class Demo

   {

       public int a = 1;                // поле даних

       public const double c = 1.66;    // константа

       public static string s = "Demo"; // статичне поле класу

       double y;                        // закрите поле даних

   }

   class Class1

   {

       static void Main()

       {

           Demo x = new Demo();            // створення екземпляру класу Demo

           Console.WriteLine("x="+x.a);    // x.a - звернення до поля класу

           Console.WriteLine("c="+Demo.c); // Demo.c - звернення до константи

           Console.WriteLine("s="+Demo.s); // звернення до статичного поля

       }

   }

}

<Слайд 54>Методи класу

Метод — функціональний элемент класу, що реализує обчислення або інші дії над змінними класу та даними, що передані йому в якості аргументів. Методи визначають поведінку класу та складають його інтерфейс. Область видимості методів визначається специфікаторами доступу. За промовчанням застосовується специфікатор internal.

Метод — завершений фрагмент коду, до якого можна звернутися за іменем. Він описується один раз, а викликатися може стільки, скільки це буде необхідно.

Розрізняють оголошення методу (метод оголошується в класі) і виклик методу (вираз виклику методу розташовується в тілі методу). Розрізняють статичні (зі специфікатором static) та нестатичні методи (оголошуються без специфікатора). Статичні методи викликаються від імені класу, в якому вони були оголошені. Вважається, що статичні методи визначають функціональність класу, а нестатичні методи визначають поведінку конкретних об'єктів-представників класу і тому викликаються від імені (посилання) об'єкта-представника класу, що містить оголошення викликаного методу.

Один і той самий метод може обробляти різні дані, що передані йому в якості аргументів.

Методи можуть бути описані в будь-якому місці класу. На відміну від C++ , C# не вимагає оголошувати методи до їхнього опису.

Синтаксис опису методу:

[атрибути] [специфікатори] тип ім’я_методу ([параметри]) тіло_методу

При описі методів можуть використовуватись модифікатори: virtual, sealed, override, abstract та extern. 

Тип методу (тип результату) визначає тип значення, що буде повернено методом.

Параметры використовуються для передачі даних в метод. Параметр – локальна змінна, котра під час виклику прийме значення відповідного аргументу.

Обов'язковим при описі заголовка методу є вказівка типу результату, імені методу та круглих дужок, наявність яких необхідна і в тому випадку, якщо сам список формальних параметрів відсутній. Формально тип результату методу вказується завжди, але значення void однозначно визначає, що метод реалізується процедурою. Тип результату, відмінний від void, указує на функцію.

       public void Sety(double z)

       { y = z; }

       public double Gety()

       { return y; }

Методи Sety та Gety є відкритими. Метод Sety реалізований як процедура, що повертає значення типу void, а метод Gety – як функція, що повертає дійсне значення.

<Слайд 55>Параметри методу

  •  Параметри визначають можину значень аргументів, які можна передати в метод.
  •  Перелік аргументів при виклику метода має відповідати переліку параметрів, тобто аргументи повинні мати типи, сумісні з типами відповідних параметрів.
  •  Для кожного параметру мають бути заданими його тип, ім’я, і, можливо, вид параметру (ref або out).
  •  Ім’я метода разом з кількістю, типами і специфікаторами його параметрів складають сигнатуру методу.
  •  В класі не може бути двох методів з однаковими сигнатурами.
  •  Метод, описаний зі специфікатором static, може звертатися тільки до статичних полів класу, тобто до полів зі специфікатором static.
  •  Статичний метод викликається через ім’я класу, а звичайний – через ім’я екземпляру класу.

Методи можуть мати параметри, які використовуються для обміну інформацією з методом. Параметр є локальною змінною, яка при виклику методу набуває значення відповідного аргументу. Область дії параметра — весь метод.

<Слайд 56>Приклад 

namespace ConsoleApplication1

{

   class Demo

   {

       public int a = 1;

       public const double c = 1.66;

       static string s = "Demo";

       double y;

       public double Gety() { return y; }         // метод отримання y

       public void Sety(double y_) { y = y_; }    // метод установки y

       public static string Gets() { return s; }  // метод отримання s

   }

   class Class1

   {

       static void Main()

       {

           Demo x = new Demo();

           x.Sety(0.12);                    // виклик методу установки y

           Console.WriteLine(x.Gety());     // виклик методу отримання y

           Console.WriteLine(Demo.Gets());  // виклик методу отримання s

       }}}

<Слайд 57>Виклик методу 

При виклику методу виконуються наступні дії:

  1.  Обчислюються вирази, що стоять на місці аргументів.
  2.  Виділяється пам'ять під параметри методу відповідно до їх типу.
  3.  Кожному з параметрів зіставляється відповідний аргумент (аргументи як би накладаються на параметри і заміщають їх). При цьому перевіряється відповідність типів аргументів і параметрів та за необхідності виконується їх перетворення.
  4.  Виконується код (тіло) методу.
  5.  Якщо метод повертає значення, воно передається в точку виклику; якщо метод має тип void, управління передається на наступний після виклику оператор.

При цьому перевіряється відповідність типів аргументів і параметрів і, при необхідності, виконується їх перетворення. При невідповідності типів видається повідомлення про помилку.

<Слайд 58>Ілюстрація передачі параметрів

Опис аргументів: int b; double a, c;

Виклик методу: obj.P(a, b, c);

Заголовок методу: public void P(double x, int y, double z);

Головна вимога при передачі параметрів полягає в тому, що аргументи при виклику методу повинні записуватися в тому самому порядку, що і в заголовку методу, і повинне існувати неявне перетворення типу кожного аргументу до типу відповідного параметра. Кількість аргументів повинна відповідати кількості параметрів.

<Слайд 59>На наступному слайді наведено приклад передачі методу параметрів:

namespace ConsoleApp

{   

   class Class1

   {   // метод вибору максимального значення

       static int Max(int a, int b)  

       {

           if ( a > b ) return a;

           else         return b;

       }

       static void Main()

       {

           int a = 2, b = 4;

           int x = Max( a, b );               // виклик методу Max

           Console.WriteLine( "x="+x );       // результат: 4

           short t1 = 3, t2 = 4;

           int y = Max( t1, t2 );             // виклик методу Max

           Console.WriteLine( "y="+y );       // результат: 4

           int z = Max( a + t1, t1 / 2 * b ); // виклик методу Max

           Console.WriteLine( "z="+z );       // результат: 5

           Console.ReadKey();

       }}}

<Слайд 60>Способи передачі параметрів

Існують два способи передачі параметрів: за значенням і за посиланням.

При передачі параметрів за значенням метод отримує копії значень аргументів, і код методу працює з цими копіями. Доступу до значень аргументів у методу немає, а, отже, немає і можливості їх змінити.

При передачі параметрів за посиланням (за адресою) метод отримує копії адрес аргументів, він здійснює доступ до елементів пам'яті по цих адресах і може змінювати значення аргументів, модифікуючи параметри.

У C# для обміну даними між викликаючими функціями і функціями, що викликаються, передбачено чотири типи параметрів:

  •  параметри-значення (без специфікатора);
  •  параметри-посилання – описуються за допомогою ключового слова (специфікатора) ref;
  •  вихідні параметри (out);
  •  параметри-масиви (params).

Ключове слово передує опису типу параметра. Якщо воно опущене, параметр вважається параметром-значенням.

Для організації передачі за посиланням параметра типу-значення потрібна явна специфікація ref або out. Для типів-посилань специфікатор ref передбачається за промовчанням (іншого способу передачі параметра для типів-посилань просто немає), а для типів-значень його необхідно явно вказувати). Параметр за посиланням і параметр за значенням – це велика різниця! Це підстава для перевантаження методу!

Параметр-масив може бути лише один і повинен бути останнім у списку, наприклад:

       public int Calculate( int a, ref int b, out int c, params int[] d ) {…}

       obj.Calculate(10, ref bVar, out cVar, 10, 20, 30, 40);

Застосування параметрів-значень та параметрів-посилань:

  1.  Для параметрів-значень використовується передача за значенням. Цей спосіб застосовується для початкових даних методу.
  •  Під час виклику методу на місці параметру, що передається за значеннями, може знаходитись вираз (включаючи окремі випадки — змінна або константа). Має існувати неявне перетворення типу виразу до типу параметру.
  1.  Параметры-посилання передаються за адресою. Цей спосіб застосовується для передачі побічних результатів методу.
  •  При виклику методу на місті параметра-посилання може знаходитись лише ім’я ініціалізованої змінної точно того ж типу. Перед імям параметру вказується ключове слово ref.

<Слайд 61>Приклад передачі параметрів-значень та посилань

namespace ConsoleApplication1

{   class Class1

   {   static void P( int a, ref int b )

       {

           a = 44; b = 33;

           Console.WriteLine( "всереденi методу a={0}, b={1}", a, b );

       }

       static void Main()

       {

           int a = 2, b = 4;

           Console.WriteLine( "перед викликом  a={0}, b={1}", a, b );

           P( a, ref b );

           Console.WriteLine( "пiсля виклику a={0}, b={1}", a, b );

}}}

Результат:

перед викликом a=2, b=4

всередині методу a=44, b=33

після виклику a=2, b=33

<Слайд 62>Використання параметру this у тілі класу

Кожен об'єкт містить свій екземпляр полів класу. Методи знаходяться в пам'яті в одному екземплярі і використовуються всіма об'єктами спільно, тому необхідно забезпечити роботу методів нестатичних екземплярів з полями саме того об'єкту, для якого вони були викликані. Для цього в будь-який нестатичний метод автоматично передається прихований параметр this, в якому зберігається посилання на поточний екземпляр об’єкта, що викликав функцію.

Це посилання є прихованим показчиком на кожний нестатичний метод класу. Будь-який метод може використовувати ключове слово this для доступу до інших нестатичних методів і змінних цього об’єкта. 

У явному вигляді параметр this застосовується для того, щоб повернути з методу посилання на об'єкт, а також для ідентифікації поля в разі, якщо його ім'я збігається з іменем параметра методу, наприклад:

   // щоб повернути з методу посилання на объект, що викликав :

   class Demo

   {

       double y;

       public Demo T() { return this; }

       // для ідентифікації поля, якщо його ім’я співпадає з іменем

       // параметру метода:

       public void Sety(double y) { this.y = y; }

   }

Первинний вираз this в тілі нестатичного методу посилається на об'єкт, "від імені" якого був зроблений виклик даного методу. Якщо метод повертає посилання, this можна використовувати в якості значення, що повертається, оператора return.

<Слайд 63>Конструктори. Типи конструкторів

Конструктор – це спеціальний метод, який виділяє пам'ять під об'єкт і ініціалізує виділену область. Його назва співпадає з іменем класу. Особливість конструктора – він не повертає значень.

Синтаксис конструктора:

ім'я_класу(список_параметрів) {тіло_конструктора}

Властивості конструктора:

- Конструктор не повертає значення (навіть типу void).

- Конструктор може бути з параметрами і без параметрів.

- У класі можуть бути визначені декілька конструкторів з різними списками параметрів для різних видів ініціалізації.

- Якщо конструктор відсутній, то він створюється автоматично (конструктор за промовчанням). Такий конструктор не має параметрів.

- Якщо в класі визначений хоча б один конструктор, конструктор за промовчанням не створюється.

При створенні об’єкту відбувається виклик відповідного конструктора класу.

им’я_класу  им’я_об’єкту = new им’я_класу();

Приклад

Variables var = new Variables();

Оператор new виділяє пам'ять, а Variables() ініціалізує її.

<Слайд 64>Приклад класу з конструктором

   class Demo

   {

       public Demo( int a, double y )      // конструктор

       {

           this.a = a;

           this.y = y;

       }

       int a;   

       double y;

   }

   class Class1

   {   static void Main()

       {

           Demo a = new Demo( 300, 0.002 ); // виклик конструктора

           Demo b = new Demo( 1, 5.71 );    // виклик конструктора

           ...   

       }

   }

Деструктор – метод, що викликається автоматично при знищенні об’єкта класу (безпосередньо перед “збиранням сміття”). Деструктор не має параметрів і не повертає результат.

Синтаксис деструктора:

~им’я_класу() {тіло деструктора}

<Слайд 65>Приклад класу з двома конструкторами

Дотепер початкові значення полів класу задавалися при описі класу. Це зручно у тому випадку, коли для всіх екземплярів класу початкові значення деякого поля однакові. Якщо ж при створенні об'єктів потрібно призначати  полю різні значення, це слід робити в конструкторі.

Часто буває зручно задати в класі декілька конструкторів, аби забезпечити можливість ініціалізації об'єктів різними способами. Всі конструктори повинні мати різні сигнатури (кількість і типи параметрів).

Якщо один з конструкторів виконує які-небудь дії, а інший повинен робити те ж саме плюс ще що-небудь, зручно викликати перший конструктор з другого. Для цього використовується вже відоме ключове слово this, але в іншому контексті. У наступному прикладі в клас Demo додано два конструктора, а поля зроблені закритими:

   class Demo

   {   // конструктор 1

       public Demo(int a)

       {   this.a = a;

       }

       // конструктор 2

       public Demo(int a, double y) : this(a)   // виклик конструктора 1

       {   this.y = y;

       }

       public double Gety()     // метод отримання поля y

       {   return y;

       }

       // закриті поля класу

       int a;

       double y;

   }

   class Class1

   {

       static void Main()

       {

           Demo a = new Demo(300);             // виклик конструктора 1

           Console.WriteLine("a.y="+a.Gety()); // результат: 0,0

           Demo b = new Demo(1, 5.71);         // виклик конструктора 2

           Console.WriteLine("b.y="+b.Gety()); // результат: 5,71

       }

   }

Конструкція, що знаходиться після двокрапки, називається ініціалізатором.

Всі класи в C# мають спільного предка — клас object. Конструктор будь-якого класу, якщо не вказаний ініціалізатор, автоматично викликає конструктор свого предка.

<Слайд 66>Статичні конструктори

Дотепер йшлося про "звичайні" конструктори, або конструктори екземпляра. Існує другий тип конструкторів — статичні конструктори, або конструктори класу. Конструктор екземпляра ініціалізує дані екземпляра, конструктор класу — дані класу.

Статичний конструктор не має параметрів, його не можна викликати явним чином. Система сама визначає момент, в який потрібно його виконати.

Деякі класи містять лише статичні дані і, отже, створювати екземпляри таких об'єктів не має сенсу. У версію 2.0 введена можливість описувати статичний клас, тобто клас з модифікатором static. Екземпляри такого класу створювати заборонено, і крім того, від нього заборонено успадковувати. Всі елементи такого класу повинні явним чином оголошуватися з модифікатором static (константи і вкладені типи класифікуються як статичні елементи автоматично). У наступному прикладі наведено опис статичного  класу.

namespace ConsoleApp

{   // статичний клас

   static class D

   {

       static int a = 200;

       static double b = 0.002;

       public static void Print()

       {

           Console.WriteLine("a = " + a);

           Console.WriteLine("b = " + b);

       }

   }

   class Class1

   {

       static void Main()

       {

           D.Print();

       }}}

<Слайд 67>Властивості

Дані-члени, що оголошуються у класі, зазвичай використовуються як змінні. Статичні члени зберігають значення, актуальні для всіх об'єктів представників класу. Нестатичні дані-члени зберігають у змінних об'єкта інформацію, актуальну для даного об'єкта.

Звернення до цих змінних виконується з використанням точкової нотації, з явною вказівкою даного-члена, призначеного для збереження (або отримання) значення. На відміну від змінних, властивості не вказують конкретні місця зберігання. Замість цього у властивостях використовуються блоки операторів, що забезпечують доступ до даних-членів для читання та запису значень. 

Для завдання властивостей у мові C# використовується спеціальний синтаксис, що передбачає опис способів отримання і установки значення  вони називаються get accessor та set accessor.

Наявність accessor'ів визначає доступність властивості для читання та запису. При зверненні до значення властивості викликається механізм читання (get accessor), при зміні значення викликається механізм запису (set accessor).

Властивості служать для організації доступу до полів класу. Як правило, властивість визначає методи доступу до закритого поля. Синтаксис властивості:

[ атрибути ] [ специфікатори ] тип імя_властивості

{

   [ get код_доступу ]

   [ set код_доступу ]

}

Найчастіше властивості оголошуються як відкриті (public).

Код доступу являє собою блоки операторів, які виконуються при отриманні (get) або установці (set) властивості. Можуть бути відсутніми або частина get, або set, але не обидві одночасно. Якщо відсутня частина set, властивість доступна лише для читання (read-only), якщо відсутня частина одержати, властивість доступна тільки для запису (write-only). У версії C# 2.0 введена можливість задавати різний рівень доступу для частин get і set.

<Слайд 68>Приклад опису властивостей

namespace ConsoleApp

{   

   class Person

   {   private string m_name; // поле класу, з яким пов'язана властивість

       public Person(string name) // конструктор класу

       {   m_name = name;     }

       public string Name   // властивість

       {   get { return m_name; }  // спосіб отримання властивості

           set { m_name = value; } // спосіб налаштування властивості

       }

   }

   class Class1

   {

       static void Main()

       {

           Person m = new Person("Kolya");

           Console.WriteLine(m.Name);// викликається метод отримання властивості

           m.Name = "Nikolay";       // викликається метод налаштування властивості

           Console.WriteLine(m.Name);// викликається метод отримання властивості

       }}}

Метод запису зазвичай містить дії з перевірки допустимості встановлюваного значення, метод читання може містити, наприклад, підтримку лічильника звернень до поля.

У програмі властивість виглядає як поле класу. При зверненні до властивості автоматично викликаються вказані в ньому методи читання і запису.

Синтаксично читання і запис властивості виглядають майже як методи. Метод get повинен містити оператор return. У методі set використовується параметр із стандартним ім'ям value, який містить встановлюване значення.


<Слайд ?>
Обробка виключень

Обработка исключений

Пусть в классе объявляются методы A и B.

При  этом  из  метода  A  вызывается  метод  B,  который  выполняет  свою  работу, возможно,  возвращает  результаты.  В  теле  метода  A  есть  точка  вызова  метода  B, и   точка   возврата,   в   которой   оказывается   управление   после   успешного возвращения из метода B.

Если  всё  хорошо,  метод  A,  возможно,  анализирует  полученные  результаты  и
продолжает свою работу непосредственно из точки возврата.
Если  при  выполнении  метода  B  возникла  исключительная  ситуация (например,

целочисленное деление на 0), возможно, что метод A узнает об этом, анализируя
возвращаемое  из  B  значение.  Таким  может  быть  один  из  сценариев “обратной

связи”,   при   котором   вызывающий   метод   узнаёт   о   результатах   деятельности вызывающего метода.

Недостатки этого сценария заключаются в том, что:

§ метод B может в принципе не возвращать никаких значений,

§ среди   множества   возвращаемых   методом   B   значений   невозможно   выделить
подмножество значений, которые можно было бы воспринимать как уведомление об
ошибке,

§ работа  по  подготовке  уведомления  об  ошибке   требует  неоправданно  больших
усилий.

Решение   проблемы   состоит   в   том,   что   в   среде   выполнения   поддерживается
модель  обработки  исключений,  основанная  на  понятиях  объектов  исключения  и
защищенных  блоков  кода.  Следует  отметить,  что  схеме  обработки  исключений  не
нова и успешно реализована во многих языках и системах программирования.

Некорректная ситуация в ходе выполнения программы (деление на нуль, выход
за  пределы  массива)  рассматривается  как  исключительная  ситуация,  на  которую
метод, в котором она произошла, реагирует ГЕНЕРАЦИЕЙ ИСКЛЮЧЕНИЯ, а не обычным
возвращением значения, пусть даже изначально ассоциированного с ошибкой.

Среда   выполнения   создает   объект   для   представления   исключения   при   его возникновении.   Одновременно   с   этим   прерывается   обычный   ход   выполнения программы.   Происходит   так   называемое   разматывание   стека,   при   котором управление  НЕ  оказывается  в  точке  возврата  и  если  ни  в  одном  из  методов, предшествующих   вызову,   не   было   предпринято   предварительных   усилий   по ПЕРЕХВАТУ ИСКЛЮЧЕНИЯ,  приложение аварийно завершается.

Можно   писать   код,   обеспечивающий   корректный   перехват   исключений,   можно создать   собственные   классы   исключений,   получив   производные   классы   из соответствующего базового исключения.

Все   языки   программирования,   использующие   среду   выполнения,   обрабатывают исключения  одинаково.  В  каждом  языке  используется  форма  try/catch/finally  для структурированной обработки исключений.

Следующий  пример  демонстрирует  основные  принципы  организации  генераторов  и перехватчиков исключений.


 

А также другие работы, которые могут Вас заинтересовать

73270. ОЧЕРКИ ПО ФИЗИОЛОГИИ ФУНКЦИОНАЛЬНЫХ СИСТЕМ 29.5 KB
  Рассмотрев две самые важные сенсорные системы опишем вкратце проприоцепцию т. сенсорную систему которая доставляет информацию о положении и движениях тела и его различных частей. Как всем известно о положении и движениях головы конечностей и всего тела мы обычно узнаём без помощи зрения. Эти рецепторы получили название проприоцепторов; это значит что они информируют нас о состоянии нашего собственного тела от лат.
73271. ВИДЫ ЧУВСТВИТЕЛЬНОСТИ НЕОПРЕДЕЛЕННОЙ КЛАССИФИКАЦИИ: КОЖНЫЕ И ХИМИЧЕСКИЕ РЕЦЕПТОРЫ 33.5 KB
  Мы знали что волокна зрительного нерва образуют синапсы с клетками наружного коленчатого тела НКТ и что аксоны клеток НКТ оканчиваются в первичной зрительной коре. Было также ясно что эти связи от сетчатки к НКТ и от НКТ к коре имеют топографическую организацию. Говоря о топографическом отображении мы имеем в виду что предшествующая структура проецируется на последующую упорядоченным образом: если идти вдоль какойлибо линии на сетчатке то проекции последовательных точек этой линии в НКТ и в коре также образуют одну непрерывную...