Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие NET.doc
Скачиваний:
26
Добавлен:
07.03.2016
Размер:
4.63 Mб
Скачать

6.9. Рекомендації з програмування

Використовуйте для зберігання даних масив, якщо кількість однотипних елементів, які потрібно обробити у вашій програмі, відома або, принаймні, відома максимальна кількість таких елементів. У останньому випадку пам'ять під масив виділяється «по максимуму», а фактична кількість елементів зберігається в окремій змінній, яка обчислюється в програмі.

При роботі з масивом потрібно обов'язково передбачати обробку виключення IndexOutOfRangeException, якщо індекс для звернення до масиву обчислюється в програмі по формулах, а не задається за допомогою констант або лічильників циклів for.

Якщо кількість елементів, що обробляються програмою, може бути довільною, зручніше використовувати не масив, а інші структури даних, колекції, що наприклад параметризуються, які розглядаються в розділі 13.

При роботі з рядками необхідно враховувати, що в С# рядок типу string є незмінним типом даних, тобто будь-яка операція зміни рядка насправді повертає її копію. Для зміни рядків використовується тип StringBuilder. Перш ніж описувати в програмі яку-небудь дію з рядками, корисно подивитися, чи немає в списку елементів використовуваного класу відповідних методів і властивостей.

Розділ 7. Класи: подробиці

У цьому розділі ми продовжимо розглядати елементи класів. Спочатку ми розглянемо додаткові можливості методів, які не описані в розділі 5, а потім перейдемо до нових елементів класу - індексаторів, операцій і деструкторам.

7.1. Перевантаження методів

Компілятор визначає який саме метод потрібно викликати за типом фактичних параметрів. Цей процес називається дозволом (resolution) перевантаження. Тип повертаємого методом значення в дозволі не бере участь. Механізм дозволу заснований на достатньо складному наборі правил, сенс яких зводиться до того, щоб використовувати метод з найбільш відповідними аргументами і видати повідомлення, якщо такий не знайдеться. Допустимо, є чотири варіанти методу, що визначає найбільше значення:

// Повертає найбільше з двох цілих:

int max(int а, int b )

// Повертає найбільше з трьох цілих:

int max(int а, int b, int e)

// Повертає найбільше з першого параметра і довжини другого:

int max (int а, string b)

// Повертає найбільше з другого параметра і довжини першого:

int max (string b, int а)

Console.WriteLine( max (1,2));

Console.WriteLine( max (1,2,3));

Console.WriteLine( max (1,"2"));

Console.WriteLine( max ("1",2));

При виклику методу max компілятор вибирає варіант методу, відповідний типу переданих в метод аргументів (у приведеному прикладі будуть послідовно викликані всі чотири варіанти методу). Якщо точної відповідності не знайдено, виконуються неявні перетворення типів відповідно до загальних правил, наприклад, bool і char в int, float в double і тому подібне. Якщо перетворення неможливе, видається повідомлення про помилку. Якщо відповідність на одному і тому ж етапі може бути отримане більш ніж одним способом, вибирається “кращий з варіантів, тобто варіант, що містить менші кількість перетворень. Якщо існує декілька варіантів, з яких неможливо вибрати кращий, видається повідомлення про помилку.

Перевантажені методи мають одне ім'я, але повинні розрізнятися параметрами, точніше, їх типами і способами передачі (out або ref). Наприклад, методи, заголовки яких приведені нижче, мають різні сигнатури і вважаються перевантаженими:

int max( int а, int b )

int max( int а, ref int b)

Перевантаження методів є проявом поліморфізму, однієї з основних властивостей ООП. Програмістові набагато зручніше пам'ятати одне ім'я методу і використовувати його для роботи з різними типами даних, а рішення про те, який варіант методу викликати, покласти на компілятор. Цей принцип широко використовується в класах бібліотеки .NET. Наприклад, в стандартному класі Console метод Writeline перевантажений 19 разів для виведення величин різних типів.