Бібліотека класів, технологія
У двох попередніх частинах цієї статті ми почали знайомство з Microsoft .NET Framework - ключовим компонентом Microsoft .NET, що представляє собою платформу для створення, впровадження і виконання Web-сервісів і додатків. Ми розповіли про основні компоненти Microsoft .NET Framework і коротко описали їх призначення. Ми також почали більш докладний розгляд Common Language Runtime (CLR) - середовища виконання .NET-додатків. Завершили ми знайомство з Common Language Runtime розповіддю про Common Type System.
У цьому номері ми почнемо знайомство з бібліотекою класів, розглянемо основні складові її простору імен і класи і наведемо деякі приклади їх використання.
Бібліотека класів .NET Framework Class Library містить класи, що забезпечують наступні функції:
- підтримку базових і визначаються користувачами типів;
- підтримку обробки виняткових ситуацій;
- операції введення / виводу і роботу з потоками;
- звернення до функцій операційної системи;
- доступ до даних;
- можливість створення Windows-додатків;
- можливість створення клієнтських і серверних Web-додатків;
- можливість створення Web-сервісів.
Всі класи, реалізовані в .NET Framework Class Library організовані у вигляді просторів імен (namespaces). Кожне простір імен містить класи та інші типи, які відносяться до специфічних завдань або групі завдань - операціями вводу / виводу, створення Web-додатків, роботі з даними і XML-документами і т.п. У таблиці показані найбільш важливі простору імен в бібліотеці класів .NET.
Після короткого огляду основних просторів імен ми готові приступити до більш детального розгляду бібліотеки класів .NET. Перша зупинка в нашій подорожі буде не зовсім звичайною - замість традиційного розгляду базового класу Object, який служить предком всіх класів в бібліотеці класів .NET, ми розглянемо клас Console і консольні додатки. Чому ми чинимо саме так, буде зрозуміло трохи пізніше.
Клас Console і консольні додатки
Використовуючи клас System.Console, ми можемо створювати найпростіші програми для середовища .NET - консольні додатки, які використовують системне вікно для введення і виведення інформації і не вимагають графічного інтерфейсу. Так як більшість прикладів в даному циклі буде використовувати консольні додатки, ми почнемо наше знайомство з бібліотекою класів з класу Console.
Використовуючи Visual Basic .NET, ми створюємо консольний додаток як новий модуль, який містить підпрограму з ім'ям Main - вона є точкою входу в наше консольний додаток:
Методи Read і ReadLine служать для читання одного або більше символів або символу нового рядка зі стандартного потоку введення, а методи Write і WriteLine - для виведення одного або більше символів або рядка з символом нового рядка в стандартний потік виведення.
Методи SetIn, SetOut і SetError дозволяють перевизначити стандартні потоки введення, виведення і помилок. Ці методи очікують аргумент типу TextWriter, який описує потік.
Тепер ми повністю готові почати вивчення Microsoft .NET Class Library. У наступному розділі ми розглянемо простір імен System і його дочірні простору імен.
Простір імен System
Простір імен System є кореневим простором імен в Microsoft .NET Class Library і містить фундаментальні типи даних, реалізовані в .NET Framework. Це простір імен містить клас Object, який служить предком для всіх класів в бібліотеці класів .NET, примітивні і розширені типи, а також понад 100 додаткових класів, використовуваних для обробки виняткових ситуацій, управління доменами додатків, збірки сміття і т.п.
клас Object
Клас System.Object служить предком для всіх класів в бібліотеці класів .NET. Методи, реалізовані в даному класі, показані на наступному малюнку.
Коротко розглянемо кожен з цих методів:
- Метод Equals (Object) або Equals (Object, Object) - служить для перевірки, чи є два об'єкти одним і тим же примірником. Для даних зі значеннями цей метод перевизначений (в класі ValueType) і дозволяє перевірити ідентичність збережених екземплярами об'єкта значень. Зверніть увагу: коли ми порівнюємо два довідкових типу, метод Equals перевіряє, чи є обидва примірники ідентичними; для даних зі значеннями метод Equals також перевіряє ідентичність даних, що зберігаються екземплярами об'єкта.
- Метод ReferenceEquals (Object, Object) перевіряє, чи є два об'єкти одним і тим же примірником класу.
- Метод Finalize () за замовчуванням не виконує ніяких дій. Цей метод може бути перевизначений в успадкованих класах для виконання фінальної очищення пам'яті перед тим, як механізм збору сміття (Garbage Collector) знищить даний об'єкт.
- Метод GetHashCode () служить для генерації хеш-значень (типу Integer), які можуть бути використані для зберігання об'єктів в хеш-таблицях.
- Метод MemberwiseClone () створює точну копію об'єкта.
- Метод ToString () повертає текстове представлення об'єкта. У більшості випадків цей метод повертає повне ім'я класу для даного об'єкта.
- Метод GetType () повертає об'єкт типу Type для даного екземпляра класу.
Нижче ми розповімо, як використовується клас Type.
Клас Type і простір імен Reflection
Клас Type є нашою точкою входу в простір імен Reflection. Відображення (Reflection) в термінах .NET - це здатність вивчати можливості класів під час виконання програми. Використовуючи відображення, ми можемо витягувати класи, вивчати їхні методи, властивості, конструктори, поля, події та інші члени, одним словом, отримуємо доступ до метаданих, асоційованим з даним класом.
Клас Type містить методи типу GetMethods () і GetProperties (), які можуть використовуватися для отримання інформації про членів класу. Використовуючи класи, реалізовані в просторі імен Reflection, ми можемо отримувати відомості, наприклад, про параметри методів (використовуючи клас System.Reflection. MethodInfo) і навіть викликати методи за допомогою методу Invoke ().
У наступному прикладі показано, як почати використовувати механізм відображень. Наведений нижче код показує, як за допомогою методу GetType () отримати об'єкт Type і яким чином можна застосовувати ряд властивостей цього об'єкта:
Коротко розглянемо основні можливості, що надаються простором імен Reflection, а потім проілюструємо деякі з них прикладами.
- Клас Assembly можна використовувати для визначення та завантаження зборок, завантаження модулів з маніфесту збірки (assembly manifest), пошуку типів, описаних в збірці, і створення екземплярів цих типів.
- Клас Module можна використовувати для пошуку класів в модулі, а також всіх глобальних і локальних методів, визначених в даному модулі.
- Клас ConstructorInfo можна використовувати для пошуку імен, параметрів, модифікаторів доступу та іншої інформації про конструктора. Пошук і виклик конструкторів ми можемо здійснювати за допомогою методів GetConstructors () або GetConstructor () об'єкта Type.
- Клас MethodInfo використовується для пошуку імен, які повернуться типів, параметрів, модифікаторів доступу та іншої інформації про метод. Пошук і виклик методів ми можемо здійснювати за допомогою методів GetMethods () або GetMethod () об'єкта Type.
- Для пошуку інформації про полях - іменах, модифікатори доступу і т.п. - використовується клас FieldInfo. Крім того, за допомогою даного класу ми можемо отримувати і задавати значення полів.
- Клас EventInfo використовується для пошуку імен, типів даних обробників подій та іншої інформації про подію. Даний клас дозволяє додавати і видаляти обробники подій.
- Клас PropertyInfo використовується для пошуку імен, типів даних та іншої інформації про властивості. За допомогою даного класу ми також можемо отримувати і задавати значення властивостей.
- Клас ParameterInfo використовується для пошуку інформації про параметри - назву, тип даних, і т.п.
У наступному прикладі показано, як отримати список типів, визначених в даному модулі.
Нижче показана виведена даними кодом інформація:
Як видно з вищенаведеного списку, в цілому концепція відображень нагадує використання інтерфейсу ITypeLibrary в Win32 API для дослідження бібліотек типів, але версія для .NET надає більше можливостей, більше проста у використанні і більш дружня до різних мов програмування.
Тепер розширимо наш приклад і додамо інформацію про властивості, конструкторах, методах, інтерфейси і події. Для цього скористаємося методами GetProperties (), GetConstructors (), GetMethods (), GetInterfaces () і GetEvents () об'єкта Type. Кожен з цих методів повертає масив елементів типу PropertyInfo, MethodInfo, EventInfo і т.п. - кожен тип успадковує від абстрактного типу MemberInfo, який ми і використовуємо в нашому прикладі. Виняток становить тільки тип PropertyInfo - цей тип використовується для того, щоб отримати додаткову інформацію про властивості:
Нижче показана інформація, що виводиться нашим прикладом для класу System.Array:
Зверніть увагу на те, що параметри методів не мають назв - в лістингу показані тільки типи даних. Щоб отримати більш детальну інформацію про параметри методів, ми повинні скористатися методом GetParameters () і структурою ParameterInfo. Як це зробити, показано нижче:
Тепер ми знаємо назви параметрів і їх тип:
Для того щоб отримати доступ до збірки (в нашому прикладі ми використовували збірку за замовчуванням (- mscorlib.dll), завжди завантажену в пам'ять), треба звернутися до цієї збірки. Ось як це зробити:
Після того як ми отримали доступ до модуля, ми можемо або вивчити певні в ньому типи (як це зробити, показано в першому прикладі), або отримати інформацію про цікавить нас типі.
У наступному номері ми продовжимо знайомство з бібліотекою класів .NET Framework Class Library. Ми розглянемо масиви (клас System.Array) і колекції (простір імен System.Collections).