if (a < b) Console.WriteLine("а меньше b");
// Сложить два объекта типа Nybble.
с = a + b;
Console.WriteLine("с после операции с = а + b: " + (int)с);
// Сложить значение типа int с объектом типа Nybble,
a += 5;
Console.WriteLine("а после операции а += 5: " + (int)a);
Console.WriteLine();
// Использовать тип Nybble в выражении типа int.
t = a * 2 + 3;
Console.WriteLine("Результат вычисления выражения а * 2 + 3: " + t);
Console.WriteLine();
// Продемонстрировать присваивание значения типа int и переполнение,
a = 19;
Console.WriteLine("Результат присваивания а = 19: " + (int)a);
Console.WriteLine();
// Использовать тип Nybble для управления циклом.
Console.WriteLine("Управление циклом for " +
"с помощью объекта типа Nybble.");
for (a = 0; a < 10; a++)
Console.Write((int)a + " ");
Console.WriteLine();
}
}
При выполнении этой программы получается следующий результат.
а: 1
b: 10
а меньше b
с после операции с = а + b: 11
а после операции а += 5: 6
Результат вычисления выражения а * 2 + 3: 15
Результат присваивания а = 19: 3
Управление циклом for с помощью объекта типа Nybble.
0123456789
Большая часть функций класса Nybble
не требует особых пояснений. Тем не менее необходимо подчеркнуть ту особую роль, которую операторы преобразования играют в интегрировании класса типа Nybble
в систему типов С#. В частности, объект типа Nybble
можно свободно комбинировать с данными других типов в арифметических выражениях, поскольку определены преобразования объекта этого типа в тип int и обратно. Рассмотрим для примера следующую строку кода из приведенной выше программы.
t = а * 2 + 3;
В этом выражении переменная t и значения 2 и 3 относятся к типу int
, но в ней присутствует также объект типа Nybble
. Оба типа оказываются совместимыми благодаря неявному преобразованию типа Nybble
в тип int
. В данном случае остальная часть выражения относится к типу int
, поэтому объект а преобразуется в тип int
с помощью своего метода преобразования.
А благодаря преобразованию типа int
в тип Nybble
значение типа int
может быть присвоено объекту типа Nybble
. Например, в следующей строке из приведенной выше программы:
а = 19;
сначала выполняется оператор преобразования типа int
в тип Nybble
. Затем создается новый объект типа Nybble
, в котором сохраняются 4 младших разряда целого значения 19, а по существу, число 3, поскольку значение 19 превышает диапазон представления чисел для типа Nybble
. Далее этот объект присваивается переменной экземпляра а. Без операторов преобразования подобные выражения были бы просто недопустимы.
Кроме того, преобразование типа Nybble
в тип Nybble
используется в цикле for
. Без такого преобразования организовать столь простой цикл for было бы просто невозможно.
--------------------------------
ПРИМЕЧАНИЕ
В качестве упражнения попробуйте создать вариант полубайтового типа Nybble, предотвращающий переполнение, если присваиваемое значение оказывается за пределами допустимого диапазона чисел. Для этой цели лучше всего сгенерировать исключение. (Подробнее об исключениях — в главе 13.)
--------------------------------
ГЛАВА 10 Индексаторы и свойства
В этой главе рассматриваются две особые и тесно связанные друг с другом разновидности членов класса: индексаторы и свойства. Каждый из них по-своему расширяет возможности класса, способствуя более полной его интеграции в систему типов C# и повышая его гибкость.
В частности, индексаторы предоставляют механизм для индексирования объектов подобно массивам, а свойства — рациональный способ управления доступом к данным экземпляра класса. Эти члены класса тесно связаны друг с другом, поскольку оба опираются на еще одно доступное в C# средство: аксессор.
Как вам должно быть уже известно, индексирование массива осуществляется с помощью оператора [ ]. Для создаваемых классов можно определить оператор [ ], но с этой целью вместо операторного метода создается индексатор, который позволяет индексировать объект, подобно массиву. Индексаторы применяются, главным образом, в качестве средства, поддерживающего создание специализированных массивов, на которые накладывается одно или несколько ограничений. Тем не менее индексаторы могут служить практически любым целям , для которых выгодным оказывается такой же синтаксис, как и у массивов. Индексаторы могут быть одно- или многомерными.
Читать дальше