Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Прості оператори






Перша категорія — прості оператори. Оскільки більшість з них елементарні, я їх просто перерахую і стисло опишу їх функції. Потім я опишу інші, менш зрозумілі.

· (х) Це різновид оператора «дужки» для управління порядком обчислень як в математичних операціях, так і при виклику методів.

· х.у Оператор «крапка» використовується для вказівки члена класу або структури. Тут х представляє суть, що містить в собі член у.

· 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 байти. Не забувайте це враховувати при визначенні розміру структур в С#.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.