Программирование >>  Программирование с использованием ajax 

1 ... 102 103 104 [ 105 ] 106 107 108 ... 396


Список людей, ОФСортированный (по имени) с помощью метода сравнения не по умолчанию list. Sort (PersonCon5>arerNaxne. Default) ; for (int i = 0; i < list.Count; i++)

Console.WriteLine( {0) ({1)) ,

(list[i] as Person) .Name, (list[i] as Person) .Age) ;

Console.ReadKey();

5. Запустите приложение. На рис. 11.8 показан результат, который должен получиться.


Рис. 11.8. Приложение ChllExOS в действии

Описание полученных результатов

Здесь класс коллекции ArrayList, содержащий объекты Person, сортируются двумя разными способами. За счет вызова метода ArrayList. Sort () применяется стандартный метод сравнения, каковым является CompareTo () из класса Person (поскольку этот класс реализует интерфейс IComparable):

public int CompareTo(object ob] ) {

if (obj is Person) {

Person OtherPerson = obj as Person; return this.Age - otherPerson.Age;

else {

throw new ArgumentException( Object to compare to is not a Person object. );

Этот метод сначала проверяет, может ли его аргумент быть подвергнут сравнению с объектом Person, т.е. может ли данный объект быть преобразован в объект Person. Если нет, генерируется исключение. Если да, выполняется сравнение свойств Age этих двух объектов Person.



Опять-таки, сначала выполняется проверка аргументов на предмет того, являются ли они объектами Person. Если нет, генерируется исключение. А если да, то тогда используется стандартный объект Comparer для сравнения строковых полей Name этих двух объектов Person.

Преобразования

Пока что операция преобразования применялась только тогда, когда было необходимо преобразовать один тип в другой, но это не является единственно возможным вариантом. Подобно тому, как тип int может преобразовываться в тип long или double неявным образом в виде части операции вычисления, классы тоже могут определяться так, чтобы они преобразовывались в другие классы (неявно или явно). Делается это путем перегрузки операций преобразования, во многом подобно перегрузке других операций, что демонстрировалось ранее в главе. О том, как именно это делается, будет рассказано в первой части этого раздела, а второй части рассматривается еще одна полезная операция as, которую обычно рекомендуется применять для выполнения приведения между ссылочными типами.

Перегрузка операций преобразования

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

Предположим, что требуется определить операцию неявного преобразования между ConvClassl и ConvClass2. Это означает, что можно использовать такой код:

ConvClassl opl = new ConvClassl (); ConvClass2 op2 = opl;

Далее осуществляется сортировка с применением нестандартного метода сравнения, заключающегося в использовании класса PersonComparerName, который реализует интерфейс IComparer. У этого класса для упрощения его использования имеется общедоступное статическое поле:

public static IComparer Default = new PersonComparerName();

Oho позволяет получать экземпляр этого класса с помощью PersonComparerName. Default, точно так же и показывавшийся ранее класс Comparer. Метод СотрагеТо () этого класса выглядит следующим образом:

public int Compare(object x, object y) {

f (x is Person && у is Person)

return Comparer.Default.Compare (

((Person)x).Name, ((Person)y).Name);

else

throw new ArgumentException( One or both objects to compare are not Person objects. );



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

ConvClassl opl = new ConvClasslO; ConvClass2 op2 = (ConvClass2) opl ;

Например, давайте рассмотрим показанный ниже код:

public class ConvClassl {

public int val;

public static implicit operator ConvClass2(ConvClassl opl) {

ConvClass2 returnVal = new ConvClass2 (); returnVal.val = opl.val; return returnVal;

public class ConvClass2 {

public double val;

public static explicit operator ConvClassl(ConvClass2 opl) {

ConvClassl returnVal = new ConvClasslO; checked { returnVal.val = (int)opl.val;}; return returnVal;

Здесь ConvClassl содержит значение типа int, a ConvClass2 - значение типа double. Поскольку значения int могут преобразовываться в значения double неявным образом, операцию неявного преобразования между ConvClassl и ConvClass2 определить можно. Обратное, однако, невозможно, и потому операция преобразования между ConvClass2 и ConvClassl должна быть определена как явная.

Это было указано с помощью ключевых слов implicit и explicit. То есть в случае данных классов, следующий код будет работать нормально:

ConvClassl opl = new ConvClasslO; opl.val = 3; ConvClass2 op2 = opl;

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

ConvClass2 opl = new ConvClass2(); opl.val = 3el5;

ConvClassl op2 = (ConvClassl) opl;

Поскольку в операции явного преобразования было использовано слово checked, показанный выше код приведет к генерации исключения, потому что значение val объекта opl является слишком большим для того, чтобы уместиться в свойстве val объекта ор2.

Операция as

Операция as позволяет преобразовывать тип в определенный ссылочный тип с применением следующего синтаксиса:

<операнд> as <тип>



1 ... 102 103 104 [ 105 ] 106 107 108 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика