Язык программирования C#9 и платформа .NET5
Часть 180 из 642 Информация о книге
Если снова запустить приложение и просмотреть его вывод (показанный далее), то будет видно, что возвращаемый методом
объектClone()действительно копирует свои внутренние переменные-члены ссылочного типа (обратите внимание, что дружественные имена уPointирЗтеперь уникальны):р4***** Fun with Object Cloning *****Cloned p3 and stored new Point in p4Before modification:p3: X = 100; Y = 100; Name = Jane;ID = 51f64f25-4b0e-47ac-ba35-37d263496406p4: X = 100; Y = 100; Name = Jane;ID = 0d3776b3-b159-490d-b022-7f3f60788e8aChanged p4.desc.petName and p4.XAfter modification:p3: X = 100; Y = 100; Name = Jane;ID = 51f64f25-4b0e-47ac-ba35-37d263496406p4: X = 9; Y = 100; Name = My new Point;ID = 0d3776b3-b159-490d-b022-7f3f60788e8aДавайте подведем итоги по процессу клонирования. При наличии класса или структуры, которая содержит только типы значений, необходимо реализовать метод
с использованием методаClone(). Однако если есть специальный тип, поддерживающий ссылочные типы, тогда для построения глубокой копии может потребоваться создать новый объект, который учитывает каждую переменную-член ссылочного типа.MemberwiseClone()Интерфейс IComparable
Интерфейс
описывает поведение, которое позволяет сортировать объекты на основе указанного ключа. Вот его формальное определение:System.IComparable// Данный интерфейс позволяет объекту указывать// его отношение с другими подобными объектамиpublic interface IComparable{int CompareTo(object o);}На заметку! Обобщенная версия этого интерфейса (
) предлагает более безопасный в отношении типов способ обработки операций сравнения объектов. Обобщения исследуются в главе 10.IСоmраrаble<Т>Создайте новый проект консольного приложения по имени
, скопируйте классыComparableCarиCarиз проектаRadio, рассмотренного в главе 7, и поменяйте пространство имен в каждом файле класса наSimpleException. Обновите классComparableCar, добавив новое свойство для представления уникального идентификатора каждого автомобиля и модифицированный конструктор:Carusing System;using System.Collections;namespace ComparableCar{public class Car{...public int CarID {get; set;}public Car(string name, int currSp, int id){CurrentSpeed = currSp;PetName = name;CarID = id;}...}}Теперь предположим, что имеется следующий массив объектов
:Carusing System;using ComparableCar;Console.WriteLine("***** Fun with Object Sorting *****\n");// Создать массив объектов Car.Car[] myAutos = new Car[5];myAutos[0] = new Car("Rusty", 80, 1);myAutos[1] = new Car("Mary", 40, 234);myAutos[2] = new Car("Viper", 40, 34);myAutos[3] = new Car("Mel", 40, 4);myAutos[4] = new Car("Chucky", 40, 5);Console.ReadLine();В классе
определен статический метод по имениSystem.Array. Его вызов для массива внутренних типов (Sort(),int,shortи т.д.) приводит к сортировке элементов массива в числовом или алфавитном порядке, т.к. внутренние типы данных реализуют интерфейсstring. Но что произойдет, если передать методуIComparableмассив объектовSort()?Car// Сортируются ли объекты Car? Пока еще нет!Array.Sort(myAutos);Запустив тестовый код, вы получите исключение времени выполнения, потому что класс
не поддерживает необходимый интерфейс. При построении специальных типов вы можете реализовать интерфейсCar, чтобы позволить массивам, содержащим элементы этих типов, подвергаться сортировке. Когда вы реализуете деталиIComparable, то должны самостоятельно принять решение о том, что должно браться за основу в операции упорядочивания. Для типаСоmраrеТо()вполне логичным кандидатом может служить внутреннее свойствоCar:CarID// Итерация по объектам Car может быть упорядочена на основе CarID.public class Car : IComparable{