Приведение и проверка типов в C#.
⇐ ПредыдущаяСтр 5 из 5 Если в одной операции присваивания смешиваются совместимые типы данных, то значение в правой части оператора присваивания автоматически преобразуется в тип, указанный в левой его части. Неявное преобразование типов происходит автоматически при следующих условиях: · оба типа совместимы; · диапазон представления чисел целевого типа шире, чем у исходного типа. В этом случае происходит расширяющее преобразование. Типы char и bool несовместимы друг с другом, а также не допускается неявное преобразование типов decimal и float или double, числовых типов и char или bool. Приведение типов – это команда компилятору преобразовать результат вычисления выражения в указанный тип. Общая форма приведения типов: (целевой_тип) выражение Целевой_тип – это тот тип, в который желательно преобразовать указанное выражение. Если приведение типов приводит к сужающему преобразованию, то часть информации может быть потеряна. Конкретный тип объекта можно определить с помощью оператора is. Общая форма: выражение is тип где выражение – отдельное выражение, описывающее объект, тип которого проверяется. Если выражение имеет совместимый или такой же тип, как и проверяемый тип, то результат этой операции получается истинным, в противном случае – ложным. Оператор as служит для преобразования типа во время выполнения без генерации исключения в случае неудачного исхода этой операции. Общая форма оператора as: выражение as тип где выражение обозначает отдельное выражение, преобразуемое в указанный тип. Если исход такого преобразования оказывается удачным, то возвращается ссылка на тип, а иначе – пустая ссылка. Оператор as может использоваться только для преобразования ссылок, идентичности, упаковки, распаковки.
Оператор typeof предназначен для получения информации о самом типе. Он извлекает объект класса System.Type для заданного типа. С помощью этого объекта можно определить характеристики конкретного типа данных. Общая форма оператора typeof: typeof (тип) где тип обозначает получаемый тип. Информация, описывающая тип, инкапсулируется в возвращаемом объекте класса Type. Рефлексия – это средство, позволяющее получать сведения о типе данных. Она позволяет выявлять и использовать возможности типов данных, известные только во время выполнения. Для применения рефлексии в код программы вводится следующая строка: using System.Reflection; Пример приведения и проверки типов (использование операторов is, as, typeof и рефлексии): using System; namespace Example { class A { } class B: A { } class ExampleDemo { static void Main() { double x = 10.0, y = 3.0; byte b1; int i; char ch; i = (int)(x / y); // дробная часть теряется Console.WriteLine("Целочисленный результат деления x на y равен {0}", i); i = 255; b1 = (byte)i;//без потери данных Console.WriteLine("b после присваивания 255: " + b1); i = 257; b1 = (byte)i;//с потерей данных Console.WriteLine("b после присваивания 257: " + b1); b1 = 88; ch = (char)b1; Console.WriteLine("ch после присваивания 88: " + ch); x = i;//неявное преобразование типов Console.WriteLine("x после присваивания 257: " + x); A a = new A(); B b = new B(); if (a is B) { b = (B)a; Console.WriteLine("Приведение типов b = (B) выполнено успешно"); } else { b = null; Console.WriteLine("Приведение типов b = (B) не допустимо"); } b = a as B; if (b == null) Console.WriteLine("Приведение типов b = (B) не допустимо"); else Console.WriteLine("Приведение типов b = (B) выполнено успешно"); Type t = typeof(A); Console.WriteLine(t.FullName); if (t.IsClass) Console.WriteLine("Это класс."); Console.WriteLine("Методы:"); System.Reflection.MethodInfo[] methodInfo = t.GetMethods(); foreach (System.Reflection.MethodInfo mInfo in methodInfo) Console.WriteLine(mInfo.ToString()); } } }
Абстрактные классы в C#. Абстрактный класс – это класс, в котором определена лишь общая форма для всех его производных классов, а наполнение ее деталями предоставляется каждому из этих классов. Класс, содержащий один или более абстрактных методов, также должен быть объявлен как абстрактный. Для этого перед его объявлением class указывается модификатор abstract.
У абстрактного метода отсутствует тело, он реализуется только в производных классах, а объявляется с помощью модификатора abstract. Абстрактный метод автоматически становится виртуальным и не требует указания модификатора virtual. Модификатор abstract может применятся только в методах экземпляра, но не в статических методах. Абстрактными могут быть также индексаторы и свойства. У абстрактного класса не может быть объектов. Когда производный класс наследует абстрактный, в нем должны быть реализованы все абстрактные методы базового класса. В противном случае производный класс должен быть также определен как abstract. Пример применения абстрактного класса: using System; namespace Example { abstract class Base { public int i; public int Sum(int x) { return x + i; } public abstract void ShowText(); } class Child1: Base { public override void ShowText() { Console.WriteLine("Класс Child1"); } } class Child2: Base { public override void ShowText() { Console.WriteLine("Класс Child2"); } } class ExampleDemo { static void Main() { Child1 ch1 = new Child1(); Child2 ch2 = new Child2(); ch1.ShowText(); ch2.ShowText(); } } } Интерфейсы в C#. Интерфейс определяет ряд методов для реализации в классе. Интерфейс представляет собой чисто логическую конструкцию, описывающую функциональные возможности без конкретной их реализации. Для реализации интерфейса в классе должны быть предоставлены тела методов, описанных в этом интерфейсе. Один и тот же интерфейс может быть реализован в двух разных классах по-разному. Благодаря поддержке интерфейсов в C# может быть реализован принцип полиморфизма: один интерфейс – множество методов. Интерфейсы объявляются с помощью ключевого слова interface и они подобны абстрактным классам, но у методов интерфейса нет тела. Упрощенная форма объявления интерфейса: interface имя { возвращаемый_тип имя_метода1 (список_параметров); возвращаемый_тип имя_метода2 (список_параметров); … возвращаемый_тип имя_методаN (список_параметров); } где имя – это конкретное имя интерфейса. Все методы должны быть реализованы в каждом классе, включающем в себя этот интерфейс. В самом интерфейсе методы неявно считаются открытыми, поэтому модификатор доступа указывать не нужно явно.
Интерфейс также может содержать свойства, индексаторы и события. Интерфейсы не могут содержать члены данных, конструкторы, деструкторы, операторные методы. Ни один из членов интерфейса не может быть объявлен как static. Для реализации интерфейса в классе достаточно указать имя этого интерфейса после имени класса через двоеточие: class имя_класса: имя_интерфейса {//тело класса} В одном классе можно реализовать несколько интерфейсов, в этом случае все реализуемые интерфейсы указываются списком через запятую. При наследовании имя базового класса должно быть указано перед списком реализуемых в производном классе интерфейсов. Методы, реализующие интерфейс, должны быть объявлены как public. Возвращаемый тип и сигнатура реализуемого метода должны полностью совпадать с возвращаемым типом и сигнатурой, указанными при определении метода в интерфейсе. Простой пример использования интерфейса: using System; namespace Example { interface IExample { void ShowText(); } class A: IExample { public void ShowText() { Console.WriteLine("Класс A"); } } class B: IExample { public void ShowText() { Console.WriteLine("Класс B"); } } class ExampleDemo { static void Main() { A a = new A(); B b = new B(); a.ShowText(); b.ShowText(); } } }
Виды массивов в C#. Массив представляет собой совокупность переменных одного типа с общим для обращения к ним именем. В C# массивы могут быть как одномерными, так и многомерными. Главное преимущество массива – в организации данных таким образом, чтобы ими было проще манипулировать. Массивы в C# реализованы в виде объектов. Одномерный массив представляет собой список связанных переменных. Общая форма для объявления одномерного массива: тип [] имя_массива = new тип[размер]; где тип объявляет конкретный тип элемента массива, а размер определяет число элементов массива. Здесь происходит объявление переменной, которая может объявляться к массиву, и создание экземпляра массива с помощью оператора new. Доступ к отдельному элементу массива осуществляется по индексу: индекс обозначает положение элемента в массиве (начиная с нулевого). Для индексирования массива достаточно указать номер требуемого элементе в квадратных скобках: имя_массива[индекс].
Общая форма инициализации одномерного массива: тип []имя_массива = {val1, val1, …, valN}; где val1-valN обозначают первоначальные значения, которые присваиваются по очереди, слева направо и по порядку индексирования. Многомерным называется такой массив, который отличается двумя или более измерениями, причем доступ к каждому элементу такого массива осуществляется с помощью определенной комбинации двух или более индексов. Общая форма объявления двумерного массива: тип [,] имя_массива = new тип [размер1, размер2]; Для доступа к элемента двумерного массива следует указать оба индекса, разделив их запятой: имя_массива[i,j]. В C# допускаются массивы трех и более измерений: тип[, …,] имя_массива = new тип[размер1, размер2, …, размерN]; Для инициализации многомерного массива достаточно заключить в фигурные скобки список инициализаторов каждого его размера: тип [,] имя_массива = { {val1, val2, …, valN}, {val1, val2, …, valN}, …, {val1, val2, …, valN} }; где каждый внутренний блок – это отдельный ряд. Ступенчатый массив – это массив массивов, в котором длина каждого массива может быть разной. Общая форма объявления двумерного ступенчатого массива: тип [][] имя_массива = new тип[размер][]; где размер – число строк в массиве. Доступ к элементу ступенчатого массива осуществляется по индексу, указываемому в отдельных квадратных скобках: mass[2][1] = 10; Ступенчатые массивы могут состоять не только из одномерных массивов, например: int [][,] = new int[3][,]; Пример использования одномерного, двумерного и ступенчатого массивов: using System; namespace Example { class ExampleDemo { static void Main() { int[] sample = new int[5]; Console.WriteLine("Элементы одномерного массива: "); for (int i = 0; i < 5; i++) { sample[i] = i; Console.Write(sample[i] + " "); } Console.WriteLine(); int[,] table = {{1, 2, 3}, {4, 5, 6}}; Console.WriteLine("Элементы двумерного массива: "); for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { Console.Write(table[i, j] + " "); } Console.WriteLine(); } int[][] mass = new int[3][]; mass[0] = new int[2]; mass[1] = new int[3]; mass[2] = new int[4]; Console.WriteLine("Элементы ступенчатого массива: "); for (int i = 0; i < 2; i++) { mass[0][i] = i; Console.Write(mass[0][i] + " "); } Console.WriteLine(); for (int i = 0; i < 3; i++) { mass[1][i] = i; Console.Write(mass[1][i] + " "); } Console.WriteLine(); for (int i = 0; i < 4; i++) { mass[2][i] = i; Console.Write(mass[2][i] + " "); } Console.WriteLine(); } } }
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|