Структурные и ссылочные типы в C#.
В C# все типы данных поделены на два вида: структурные и ссылочные. Все структурные типы являются наследниками класса System.ValueType и память для их объектов всегда выделяется в стеке. Структурные типы еще называют типами значений. Типы значений состоят из двух основных категорий: структуры и перечисления (enum). Структуры делятся на следующие категории: · Числовые типы o Целочисленные типы o Типы с плавающей точкой o Десятичный тип · Логический тип · Структуры, определяемые пользователем (struct) Переменные, основанные на типах значений, содержат непосредственно значения. При присвоении переменной одного типа значений другому создается копия присваиваемого значения. В этом и есть отличие от ссылочных типов, при присвоении которых копируются ссылки на объект, а не сами объекты. Для каждого типа значений существует неявный конструктор по умолчанию, инициализирующий значение по умолчанию для данного типа (для bool это значение false, для перечисляемых типов – нулевое). Все типы значений являются простыми (или примитивными) типами, т.к. состоят только из одного значения. Целочисленные типы:
Старший разряд целого числа используется в качестве флага знака. Если флаг знака равен 0, то число считается положительным, а если 1, то отрицательным. Числа с плавающей точкой позволяют представлять числа с дробной частью, к ним относятся float (32 бита) – с одинарной точностью и double (64 бита) – двойной точности.
Десятичный тип decimal (128 бит) предназначен для применения в финансовых расчетах. Этот тип позволяет представить числа с точностью до 28 десятичных разрядов. Чтобы значение интерпретировалось как десятичный тип, к нему необходимо добавить суффикс m в конце, например: decimal d = 5.95m; В C# символы представлены 16-разрядным уникодом (тип char). Для того, чтобы присвоить значение символьной переменной, достаточно заключить символ в одинарные кавычки. Логический тип bool прелставляет два значения – true (истина) и false (ложь). Перечисление представляет собой множество именованных целочисленных констант. Перечислимый тип данных объявляется с помощью ключевого слова enum. Общая форма объявления: enum имя {список_перечисления}; где имя – это имя типа перечисления, а список_перечисления – список идентификаторов, разделяемый запятыми. Каждая символически обозначаемая константа в перечислении имеет целое значение. К ссылочным типам относятcя: · тип object; · тип string; · классы (class); · интерфейсы (interface); · делегаты (delegate); · строки (string). Ссылочные типы хранятся в куче или хипе, которую можно представить, как неупорядоченный набор разнородных объектов. Физически это остальная часть памяти, которая доступна процессору. При создании объекта ссылочного типа в стеке помещается ссылка на адрес в куче. Когда объект ссылочного типа перестает использоваться, то ссылка из стека удаляется, и память очищается. После этого происходит автоматическая «сборка мусора», которая удаляет объекты, на которые нет ссылок.
15. Перечисляемые типы в C# Перечисление представляет собой множество именованных целочисленных констант. Перечислимый тип данных объявляется с помощью ключевого слова enum. Общая форма объявления: enum имя {список_перечисления};
где имя – это имя типа перечисления, а список_перечисления – список идентификаторов, разделяемый запятыми. Каждая символически обозначаемая константа в перечислении имеет целое значение. Для каждой последующей символически обозначаемой константы в перечислении задается целое значение, которое на единицу больше, чем у предыдущей константы. По умолчанию значение первой символически обозначаемой константы в перечислении равно нулю. Доступ к членам перечисления осуществляется по имени их типа, после которого следует оператор-точка. Значение одной или нескольких символически обозначаемых констант в перечислении можно задать с помощью инициализатора. Для этого достаточно указать после символического обозначения отдельной константы знак равенства и целое значение. По умолчанию в качестве базового для перечисления выбирается тип int, тем не менее перечисление может быть создано любого целочисленного типа, за исключением char. Для того, чтобы указать любой тип, кроме int, достаточно поместить этот тип после имени перечисления, отделив его двоеточием. Общая форма: enum имя: тип {список_перечисления}; Пример применения перечисления: using System; namespace Example { class Example { public enum Music { Start, Pause, Stop }; public void Player (Music m) { switch (m) { case Music.Start: Console.WriteLine("Включить музыку"); break; case Music.Pause: Console.WriteLine("Нажать на паузу"); break; case Music.Stop: Console.WriteLine("Остановить музыку"); break; } } } class ExampleDemo { static void Main() { Example ex = new Example(); ex.Player(Example.Music.Start); } } }
16. Перегрузка операторов в C# Перегрузка операторов – процесс определения назначения оператора по отношению к создаваемому классу. При этом действие оператора полностью контролируется и может меняется в зависимости от конкретного класса. Когда оператор перегружается, ни одно из его первоначальных значений не меняется. Главное преимущество перегрузки операторов заключается в том, что она позволяет плавно интегрировать класс нового типа в среду программирования. Для перегрузки оператора служит ключевое слово operator, определяющее операторный метод, который, в свою очередь, определяет действие оператора относительно своего класса. Существует две формы операторных методов (operator): одна – для унарных операторов, другая – для бинарных.
Общие формы: Перегрузка унарного оператора: public static возвращаемый_тип operator op (тип_параметра операнд) {//операции} Перегрузка бинарного оператора: public static возвращаемый_тип operator op (тип_параметра1 операнд1, тип_параметра2 операнд2) {//операции} Здесь вместо op подставляется перегружаемый оператор, а возвращаемый_тип обозначает конкретный тип значения, возвращаемого данной операцией. Для унарных операторов операнд обозначает передаваемый операнд, а для бинарных операторов то же самое обозначают операнд1 и операнд2. Операторные методы должны быть public и static. Тип операнда унарных операторов должен быть такой же, как и у класса, для которого перегружается оператор. А в бинарных операторах хотя бы один из операндов должен быть такого же типа, как и у его класса. В параметрах оператора нельзя использовать модификаторы ref или out. Пример перегрузки: using System; namespace Example { class Example { int x, y, z; // трехмерные координаты public Example() { x = y = z = 0; } public Example(int i, int j, int k) { x = i; y = j; z = k; } // Перегрузить бинарный оператор +. public static Example operator +(Example opl, Example op2) { Example result = new Example(); /* Сложить координаты двух точек и возвратить результат. */ result.x = opl.x + op2.x; result.y = opl.y + op2.y; result.z = opl.z + op2.z; return result; } public static Example operator -(Example op) { Example result = new Example(); result.x = -op.x; result.y = -op.y; result.z = -op.z; return result; } // Вывести координаты X, Y, Z. public void Show() { Console.WriteLine(x + ", " + y + ", " + z); } } class ExampleDemo { static void Main() { Example a = new Example(1, 2, 3); Example b = new Example(3, 2, 1); Example c = new Example(); c = a + b; c.Show(); c = -a; c.Show(); } } }
Также можно перегружать операторы отношений, ключевые слова true и false в качестве унарных операторов (только попарно), логические операторы &, | и!. Перегрузке не подлежат составные операторы, операторы присваивания. Нельзя изменять приоритет любого оператора или количество операндов, которое требуется для оператора.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|