|
Программирование >> Программирование с использованием ajax
А для его распаковки подойдет обычный синтаксис приведения типов: MyStruct ValType2 = (MyStruct)refType; Как видно из этих примеров, процесс упаковки не требует вмешательства со стороны разработчика, т.е. писать какой-то код для обеспечения его выполнения не нужно. Что касается процесса распаковки значения, то тут требуется явное преобразование, т.е. нужно явным образом выполнять приведение типов (упаковка выполняется неявно и потому такого требования не имеет). Может возникнуть вопрос о том, зачем вообще делать подобное? На самом деле, существуют две очень веских причины, по которым упаковка является чрезвычайно полезной. Во-первых, она позволяет использовать типы-значения в коллекциях (вроде ArrayList), где элементы являются элементами типа object. Во-вторых, она представляет собой внутренний механизм, который обеспечивает возможность вызывать для типов-значений, подобных int и struct, методы object. Напоследок хотелось бы отметить, что выполнение распаковки является просто необходимым перед получением доступа к содержимому типов-значений. Операция is Несмотря на название, операция is вовсе не представляет собой способ для определения того, является ли объект объектом конкретного типа. Вместо этого она позволяет проверять, является ли объект объектом заданного типа, а также то, может ли он быть преобразован в объект такого типа. В случае удовлетворения этого условия операция is возвращает true. В более ранних примерах уже демонстрировались классы Cow и Chicken, унаследованные от класса Animal. В случае применения is для сравнения объектов с типом Animal значение true будет возвращаться для объектов всех трех этих типов, а не только Animal. Достичь подобного с помощью метода GetType () и операции typeof (), которые показывались ранее, было бы очень трудно. Синтаксис операции is выглядит следующим образом: <операнд> is <тип> Возможные результаты этого выражения перечислены ниже. □ В случае указания в <тип> типа класса,true будет возвращаться, если содержащийся в <операнд> операнд является объектом такого типа, если он унаследован от такого типа и если он может быть упакован в такой тип. □ В случае указания в <тип> типа интерфейса true будет возвращаться, если содержащийся в <операнд> операнд является объектом такого типа и если он является объектом типа, который реализует такой интерфейс. □ В случае указания в <тип> типа-значения true будет возвращаться, если содержащийся в <операнд> операнд является объектом такого типа и если он является объектом типа, который может быть распакован в такой тип. В следующем практическом занятии демонстрируется, как все это работает. Практическое занятие ИСПОЛЬЗОВЭНИе ОПерЭЦИИ is 1. Создайте новое консольное приложение по имени ChllEx04 и сохраните его в каталоге С:\BegVCSharp\Chapterll. 2. Измените код в его файле Program.cs следующим образом: interface IMylnterface class ClassA : IMylnterface class ClassB : IMylnterface lass ClassC class ClassD : ClassA struct MyStruct : IMylnterface class Program { static void Main(string[] args) { Checker check = new Checker (); ClassA tryl = new ClassA (); ClassB try2 = new ClassB (); ClassC try3 = new ClassC (); ClassD try4 = new ClassD(); MyStruct tryS = new MyStruct (); object try6 = try5; Console.WriteLine( Analyzing ClassA type variable: Анализ переменной типа ClassA namespace ChllEx04 { class Checker { public void Check(object paraml) { if (paraml is ClassA) Console.WriteLine( Variable can be converted to ClassA. ); Переменная может быть преобразована в ClassA else Console.WriteLine( Variable cant be converted to ClassA. ); Переменная не может быть преобразована в ClassA if (paraml is IMylnterface) Console.WriteLine( Variable can be converted to IMylnterface. ); Переменная может быть преобразована в IMylnterface else Console.WriteLine( Variable cant be converted to IMylnterface. ); Переменная не может быть преобразована в IMylnterface if (paraml is MyStruct) Console.WriteLine( Variable can be converted to MyStruct. ); Переменная может быть преобразована в MyStruct else Console.WriteLine( Variable cant be converted to MyStruct. ); Переменная не может быть преобразована в MyStruct check.Check(tryl) , Console.WriteLine check.Check(try2 Console.WriteLine check.Check(try3 Console.WriteLine check.Check(try4) , Console.WriteLine check.Check(try5) , Console.WriteLine check.Check(try6) , Console.ReadKey() , ( \nAnalyzing ClassB type variable: ); Анализ переменной типа ClassB ( \nAnalyzing ClassC type variable: ); Анализ переменной типа ClassC ( \nAnalyzing ClassD type variable: ); Анализ переменной типа ClassD ( \nAnalyzing MyStruct type variable: ); Анализ переменной типа MyStruct ( \nAnalyzing boxed MyStruct type variable: ); Анализ упакованной переменной типа MyStruct 3. Запустите приложение. На рис. 11.6 показан результат, который должен получиться. Рис. 11.6. Приложение ChllExO4 в действии Описание полученных результатов Этот пример иллюстрирует различные результаты, которые можно получать в случае применения операции is. Три класса, интерфейс и структура определяются и используются в качестве параметров для метода класса, который применяет операцию is для выяснения того, могут ли они быть преобразованы в тип С lass А, тип интерфейса и тип структуры. Только типы ClassA и ClassD (унаследованные от С lass А) являются совместимыми с Class А. Типы, которые не наследуются ни от какого класса, не являются совместимыми с этим классом.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |