Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Ватсон К. -> "С#" -> 121

С# - Ватсон К.

Ватсон К. С# — Лори, 2005 . — 879 c.
ISBN 1-861004-98-2
Скачать (прямая ссылка): vatsonc2005.pdf
Предыдущая << 1 .. 115 116 117 118 119 120 < 121 > 122 123 124 125 126 127 .. 404 >> Следующая


valType2.Val = 6
Дополнительные сведения о классах

255

Также можно осуществлять упаковку переменных в интерфейс, если этот интерфейс в них реализован. Предположим, что тип MyStruct реализует интерфейс iHyinterface следующим образом:

interface 1Луinterface t

>

struct MyStruct :¦ IMylnterCace

(

public int Valj

>

В таком случае можно выполнить упаковку этой структуры в тип iMyinterface;

MyStruct valiypel - new MyStructО г IHylnterface refType » valTypelj

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

MyStruct valType2 = (MyStruct)refTypet

Как можно заметить по этим примерам, процедура упаковки выполняется без вмешательства с нашей стороны (другим словами, отсутствует необходимость писать какой-либо код). А вот процедура распаковки требует выполнения явного преобразования типов, т. е. нужно выполнить приведение типа (упаковка выполняется неявно и таких требований не предъявляет).

Возможно, вы недоумеваете, для чего все это может понадобиться. На самом деле существуют две причины считать процедуру упаковки чрезвычайно полезной. Во-первых, она позволяет использовать значимые типы в семействах (например, в ArrayList), в которых собраны элементы ссылочного типа. Вогвторых, она представляет собой некий внутренний механизм, позволяющий вызывать методы типа object для значимых типов вроде int или struct.

И последнее замечание, которое необходимо сделать: выполнение процедуры распаковки является необходимым условием для осуществления доступа к содержимому значимых типов.

Оператор is

Оператор is проверяет, можно ли преобразовать какую-либо неизвестную переменную (например, переданную методу в качестве параметра-объекта) в указанный тип; при этом значение true свидетельствует, что такое преобразование осуществимо. Этот оператор позволяет, прежде чем вызывать методы на объект, проверять, реализован ли такой метод в типе объекта.

Оператор !¦ проверяет не идентичность типов, а их совместимость. I

Оператор ie использует следующий синтаксис:

<огсерлнд> is <тип>

Результаты использования такого выражения могут быть следующие:

? Еслн <™п> — это тип класса, то результат true будет получен в том случае, еслн <операнд> имеет тот же самый тнп, наследуется от этого типа нлн допускает упаковку в такой тнп.
256

Глава 11

? Если <тип> — это тнп интерфейса, то результат true будет получен, если <операмд> имеет тот же самый тип или тнп, в котором данный интерфейс реализован.

? Еслн <тип> — это значимый тнп, то результат true будет получен, если <оперлнд> имеет тот же самый тнп или если его тип допускает распаковку в указанный тип.

Давайте рассмотрим несколько примеров, чтобы увидеть, как все это работает иа практике.

Практикум: использование оператора is

1. Создайте новое консольное приложение с именем сьнехОЗ В директории C:\BeaCSharp\Chapterll.

2. Модифицируйте код в ciassi.es следующим образом:

namespace ChllEx03 (

class Checker

<

public void Check (object par ami)

{

if (paraml is Claes. -

Coneole.WriteLine('Variable can be converted to ClassA,'); else -

Console.WriteLinel'Variable can't be converted to ClassA»'}; if (paraml is IMyIn rface)

Console.WriteLinef'Variable can be converted to IMylnterface.')j else

Console.WriteLine('Variable can’t be converted to IMylnterface, '); if (paraml is MyStruct}

Console.WriteLinef'Variable can be converted to MyStruct.'}; else

Console.WriteLine('Variable can't be converted to MyStruct. ');

)

nt rface ИуInterface

class ClassA ; IMylnterface

class ClaasB ; IMylnterface

class ClassC

class ClassO : ClassA

struct MyStruct : IMylnterface
Дополнительные сведения о классах

257

III <summary>

III Summary description for Clasal.

Ill </summary> class Classl С

static void Mein(string[] args)

{ ¦ _l Checker check ¦ new Checker()i ClassA tryl = new ClassA () ;

Cl&saB tryS ¦ new ClaesBO ;

ClassC try3 » new ClaaeC()i ClaseD try4 - new ClassD{);

MyStruct try5 “ new MyStruct (>; .

object try6 » try5;

Console.WriteLine(* lyzing ClassA type variable:;

chi k. Check < tryl 11

Console.WriteLine{*\nAnalyzing ClaseB type variable!*); check.Check(try2); . ¦

Console.WriteLine('\nAnalyzing ClassC type variable:'1); check.Check(try3); .

Console.WriteLine(*\nAnalyzing ClaseD type variable:'); check.Check{try/); .

Console.WriteLine(*\nAnalyzing MyStruct type variable:*); check .check (trySb

Coneole.t№iteLine('\nAnalyzing boxed MyStruct type variable:'); check,Check(try 6); .

)

)

3. Выполните код (см. рис. слева).

Как это работает

Этот пример иллюстрирует различные результаты, к которым может привести применение оператора is, В программе определяются четыре класса, интерфейс и структура, в дальнейшем используемые как параметры метода класса, в котором оператор is проверяет, могут ли они быть преобразованы в тип ClassA, в тип интерфейса и в тип структуры.

Совместимыми с классом ClassA являются только сам ClassA и classD (он наследуется от класса ciassA). Тнпы, которые не наследуются от данного класса, не являются совместимыми с названным классом.
Предыдущая << 1 .. 115 116 117 118 119 120 < 121 > 122 123 124 125 126 127 .. 404 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.