Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Прості оператори
Перша категорія — прості оператори. Оскільки більшість з них елементарні, я їх просто перерахую і стисло опишу їх функції. Потім я опишу інші, менш зрозумілі. · (х) Це різновид оператора «дужки» для управління порядком обчислень як в математичних операціях, так і при виклику методів. · х.у Оператор «крапка» використовується для вказівки члена класу або структури. Тут х представляє суть, що містить в собі член у. · f(x) Такий різновид оператора «дужки» застосовується для перерахування аргументів методів. · а[х] Квадратні дужки використовуються для індексації масиву. Ці дужки також застосовуються спільно з індексаторами, коли об'єкти можуть розглядатися як масив. Про індексатори див. розділ 7. · х++ Про оператора інкремента ми поговоримо окремо в розділі «Оператори інкремента і декремента». · х— Оператор декремента ми теж розглянемо пізніше. · new Цей оператор використовується для створення екземплярів об'єктів на підставі визначення класу. Typeof Віддзеркалення (reflection) — це здатність отримувати інформацію про тип в період виконання. Ця інформація включає імена типів, класів і елементи структур. У.NET Framework ця функціональність пов'язана з класом System. Type. Цей клас — корінь всіх операторів віддзеркалення і може бути отриманий за допомогою оператора typeof. Простій приклад, що ілюструє простоту застосування оператора typeof 'для отримання практично будь-якої інформації про тип або об'єкт під час виконання програми: using System; using System.Reflection; public class Apple { public int nSeeds; public void Ripen() { > > public class TypeOfApp { public static void Main() { Type t = typeof(Apple); string className = t.ToStringO; Console.ИгШипе(" \пИнформация 0 класі {О}", className); Console.WriteLine(" \nMeroflH {0}", className); Console. WriteLine(" —"); Methodlnfo[] methods = t.GetMethodsO; foreach (Methodlnfo method in methods) { Console.WriteLine(method.ToSt ring()); } Console.WriteLine(" \nBce члени {О}", className); Console. Writel_ine(" —"); Memberlnfo[] allMembers = t.GetMembersO; foreach (Memberlnfo member in allMembers) { Console. WriteLine(member.ToStringO); } > } У цій програмі міститься клас Apple, у якого всього два члени: поле nSeeds і метод Ripen. Спочатку, використовуючи оператора typeof і ім'я класу, я отримую об'єкт System. Type, який потім зберігається в змінній t. З цієї миті я можу використовувати об'єкт System. Type для отримання всіх методів і членів класу Apple. Це робиться за допомогою методів GetMethods і GetMembers відповідно. Результати виконання цих методів виводяться на стандартний пристрій виводу таким чином: Інформація про клас Apple Методи Apple Int32 GetHashCodeQ Boolean Equals(System.Object) System.String ToStringQ Void RIPENO System.Type GetTypeO Всі члени Apple Int32 nSeeds Int32 GetHashCodeO Boolean Equals(System.Object) System.String ToStringO Void RIPENO System.Type GetTypeO Void.ctorO Перш ніж рухатися далі, хочу зробити два зауваження. По-перше, звернете увагу, що виводяться і успадковані члени класу. Оскільки клас не породжений явно з іншого класу, ми знаємо, що всі члени, не визначені в класі Apple успадковуються від неявного базового класу System.Object. По-друге, об'єкт System.Type можна отримати методом GetType. Цей успадкований від System.Object метод дозволяє працювати з об'єктами, а не з класами. Будь-яким з двох приведених далі фрагментів можна використовувати для отримання об'єкту System. Type. II Отримання об'єкту System.Type на основі визначення класу. Type t1 = typeof(Apple); // Отримання об'єкту System.Type з об'єкту. Apple apple = new APPLEQ; Type t2 = apple.GetTypeO; Sizeof Оператор sizeof застосовується для отримання розміру вказаного типу в байтах. При цьому пам'ятаєте про два виключно важливі чинники. По-перше, sizeof можна застосовувати тільки до розмірних типів. Отже, хоча його можна використовувати для членів класів, для класів як таких його застосовувати не можна. По-друге, sizeof можна застосовувати тільки в методах або блоках коду, помічених як unsafe. Ось приклад використання оператора sizeof в методі класу, поміченого як unsafe: using System; class BasicTypes { // Примітка: Код, що використовує оператора sizeof, // повинен бути помічений як unsafe, static unsafe public void ShowSizesQ { Console.WriteLine(" \nPa3Mephi основних типів"); Console.WriteLine(" Pa3Mep short = {0}", sizeof(short)); Console.WriteLine(" Pa3Mep int = {0}", sizeof(int)); Console.Writel_ine(" Pa3Mep long = {0}", sizeof(long)); Console.WriteLine(" Pa3Mep bool = {0}", sizeof(bool)); } } class UnsafeUpp { unsafe public static void MAINQ { BasicTypes.ShowSizes(); } } Ось результат виконання цього застосування: Розміри основних типів Розмір short = 2 Розмір int = 4 Розмір long = 8 Розмір bool = 1 Оператора sizeof можна використовувати для визначення розмірів не тільки простих вбудованих типів, але і призначених для користувача розмірних типів, таких як структури. Проте при цьому результати sizeof можуть бути неочевидні: // Використання оператора sizeof. using System; struct StructWithNoMembers { } struct StructWithMembers { short s; int i; long 1; bool b; } struct CompositeStruct { StructWithNoMembers а; StructWithMembers b; StructWithNoMembers з; } class UnSafe2App { unsafe public static void Main() { Console.WriteLine(" \nPa3Mep StructWithNoMembers structure = {0}", sizeof(StructWithNoMembers)); Console.WriteLine(" \nPa3Mep StructWithMembers structure = {0}", sizeof(StructWithMembers)); Console.WriteLine(" \nPa3Mep CompositeStruct structure = {0}", sizeof(CompositeStruct)); } } Хоча можна припустити, що це застосування виведе 0 для структури без членів (StructWithNoMembers), 15 для структури з чотирма членами базових типів (StructWithMembers) і 15 для структури, що агрегує дві попередні (CompositeStruct), насправді результат буде таким: Розмір StructWithNoMembers structure = 1 Розмір StructWithMembers structure = 16 Розмір CompositeStruct structure = 24 Пояснення цьому — спосіб збереження конструкції struct компілятором у вихідному файлі, при якому компілятор застосовує вирівнювання і доповнення пропусками. Наприклад, якщо структура має розмір 3 байти і встановлено вирівнювання по 4-байтним межам, компілятор автоматично додасть в структуру 1 байт, і оператор sizeof вкаже, що розмір структури — 4 байти. Не забувайте це враховувати при визначенні розміру структур в С#.
|