Г. Шилдт - С#4.0 Полное руководство (1160795), страница 154
Текст из файла (страница 154)
А поскольку для ее выполнения требуется некоторое время, то желательно, чтобы она не происходила в тот момент, когда решается критичная по времени задача. С другой стороны, "сборку мусора" и другие вспомогательнгяе операции можно выполнить во время простоя программы. Имеется также возможность регистрировать уведомления о приближении и завершении "сборки мусора". Для проектов с неуправляемым кодом особое значение имеют два следующих метода из класса ОС: дс)оиетогуРгеяяпге () и РеточенетогуРгеяяпге () .
С их помощью указывается большой объем неуправляемой памяти, выделяемой или освобождаемой в программе. Особое значение этих методов состоит в том, что система управления памятью не контролирует область неуправляемой памяти. Если программа выделяет большой объем неуправляемой памяти, то это может сказаться на производительности, поскольку системе ничего неизвестно о таком сокращении объема свободно доступной памяти. Если же большой объем неуправляемои памяти выделяется с помощью метода дс(с)МетогуРгея виге (), то система С(.Е уведомляется о сокращении объема свободно доступной памяти.
А если выделенная область памяти освобождается с помощью метода РетоуенетогуРгеяяиге (), то система СЕВ уведомляется о соответствующем восстановлении объема свободно досгупной памяти. Следует, однако, иметь в виду, что метод КеточенетогуРгеяяиге () необходимо вызывать только для уведомления об освобождении области неуправляемой памяти, выделенной с помощью метода Дс)днетогуРгевяцге () . Тлава 21. Пространство имен Зувтегп 777 Класс оЬ1ео~ В основу типа оьбесс в С(Г положен класс оьбесг.
Члены класса Оь)есс подробно рассматривались в главе 11, но поскольку он играет главную роль в С((, то его методы ради удобства повторно перечисляются в табл. 21.1б. В классе оЬ1 есг определен конструктор риЬЬьс ОЬ)есг() который создает пустой объект, Таблица 21.16. Методы, определенные в классе ОЬзеоЬ Метод Назначение рпЬ11с чдггпа1 Ьоо1 Ег[иа1э (оЬ)есг оЬ1) Возвращает логическое значение ггсе, если вы- зывающий объект оказывается таким же, как и ОбЪЕКт, ОПрЕдЕЛяЕМЫй ПараМЕтрОМ оЬтх В ПрО- тивном случае возвращается значение Га1ее Возвращает логическое значение сгпе, если объект оЬС д оказывается таким же, как и объект оЬ)В.
В противном случае возвращается значе- ние Та1зе Выполняет завершающие действия перед процес- СОМ "СбОрКИ МуСОра". В С(т МЕтОд Еьпа11зе [) доступен через деструктор Возвращает хеш-код, связанный с вызывающим обьектом Получает тип обьекта во время выполнения про- граммы Создает "неполную" копию объекта. При этом ко- пируются члены, но не объекты, на которые ссы- лаются эти члены Возвращает логическое значение стае, если объекты оьтл и оьтВ ссылаются на один и тот же объект.
В противном случае возвращается ло- гическое значение Та1зе Возвращает строку, описывающую объект риЫТс зсагьс Ьоо1 Есрза1э (оЬ)есс оЬтл, оЬ1есс оЬ1В) ргогессес) Гзпа11зе() риЬ11с чьггпа1 Тпг СесиазЬСог[е() рпЫ1с Туре Сегтуре() рго1есьес( оЬ)есс МеагЬеги1эеС1опе() риЫТс згасдс Ьоо1 ВегегепсеЕс[па1э(оЬбесс оЬ)А, оЬ)есг оЬ2В) риЫТс ч1гсиа1 згг1п1т ТоБСг1пд() Класс тир1е В версии .НЕТ Ргагпеигог)г 4.0 внедрен удобный способ создания групп объектов (так называемых кортежей). В основу этого способа положен статический класс Тпр1е, в котором определяется несколько вариантов метода Сгеаге () для создания кортежей, а также различные обобщенные классы типа Тыр1е<...
>, в которых инкапсулируются кортежи. В качестве примера ниже приведено объявление варианта метода Сгеаге [), возвращающего кортеж с тремя членами. 778 Часть! 1. Библиотека С(г роЬ11о воаг1о Тор1е<Т1, Т2, ТЗ> Сгеаге<Т1, Т2, ТЗ>(Т1 1геа1, Т2 згеа2, ТЗ 1геиз) Следует заметить, что данный метод возвращает объект типа Тир1е<Т1, Т2, ТЗ>, в котором инкапсулируются члены кортежа 1гегв1, згегв2 и 1 СегвЗ.
Вообще говоря, кортежи оказываются полезными в том случае, если группу значений нужно интерпретировать как единое целое. В частности, кортежи можно передавать методам, возвращать из методов или же сохранять в коллекции либо в массиве. Интерфейсы ХСотйрахаЬ1е и ХСотйрагаЬ1е<Т> Во многих классах приходится реализовывать интерфейс ТСоырагаЬ1е или 1Сопра гаЬ1е<Т>, поскольку он позволяет сравнивать один объект с другим, используя различные методы, определенные в среде ЛЕТ Ргатетчог)с.
Интерфейсы ТсотрасаЬ1е и 1 Совр агаЬ1е <Т> были представлены в главе 18, где они использовались в примерах программ для сравнения двух объектов, определяемых параметрами обобщенного типа. Кроме того, они упоминались при рассмотрении класса Ассау ранее в этой главе. Но поскольку эти интерфейсы имеют особое значение и применяются во многих случаях, то ниже приводится их краткое описание. Итперфейс 1СоврагаЬ1е реализуется чрезвычайно просто, потому что он состоит всего лишь из одного метода. з ог СоврагеТо(оЬЗеог оЬЗ) В этом методе значение вызывающего объекта сравнивается со значением объекта, определяемого параметром оЬЗС Если значение вызывающего объекта больше, чем у объекта оЬЗ, то возвращается положительное значение; если оба значения равны— нулевое значение, а если значение вызывающего объекта меньше, чем у объекта оЬЗ,— отрицательное значение. Обобщенный вариант интерфейса ТСогврагаЬ1е объявляется следующим образом.
роЬ11о ьогегтасе теоврагаЬ1е<т> В данном варианте тип сравниваемых данных передается параметру Т в качестве аргумента типа. В силу этого объявление метода согврагеТо ( ) претерпевает изменения и выглядит так, как показано ниже. 1ог СотрагеТо (Т огвег) В этом объявлении тип данных, которыми оперирует метод согврагето (), может быть указан явным образом. Следовательно, интерфейс 1СоырагаЬ1е<Т> обеспечивает типовую безопасность. Именно по этой причине он теперь считается более предпочтительным в программировании на СФ, чем интерфейс 1СоырагаЬ1е. Интерфейс 1Есрта1аЬ1е<Т> Интерфейс 1ес(иасаь1е<т> реализуется в тех классах, где требуется определить порядок сравнения двух объектов на равенство их значений. В этом интерфейсе определен только один метод, ВЧиа1в ( ), объявление которого приведено ниже.
Глава 21. Пространство имен ЗувТев) 779 ЬЬЬ1 Ейда1я(т аГЛег) Этот метод возвращает логическое значение Ггпе, если значение вызывающего объекта оказывается равным значению другого объекта оГЛег, в противном случае— логическое значение Та1яе. Интерфейс 1Ес)пасаЬ1е<Т> реализуется в нескольких классах и структурах среды МЕТ Ргашеттог)с, включая структуры числовых типов и класс НГЬ1по.
Для реализации интерфейса 1Ег)пасаЬ|е<Т> обычно требуется также переопределять методы Ес(па1я (ОЬуесг) и ОегнаяЬСос)е (), определенные в классе ОЬПесг. Интерфейс 1Сот1чег1хЬ1е Интерфейс 1соптеггТЫе реализуется в структурах всех типов значений, еьгьпо и Оасет1пе. В нем определяются различные преобразования типов.
Реализовывать этот интерфейс в создаваемых пользователем классах, как правило, не требуется. Интерфейс 1С1опеаЬ1е Реализовав интерфейс 1С1опеаЬ1е, можно создать все условия для копирования объекта. В интерфейсе 1С1опеаЬ1е определен только один метод, С1опе ( ), объявление которого приведено ниже. оЬ)ест С1опе() В этом методе создается копия вызывающего объекта, а конкретная его реализация зависит от способа создания копии объекта. Вообще говоря, существуют две разновидности копий объектов: полная и неполная.
Если создается полная копия, то копия соверщенно не зависит от оригинала. Так, если в исходном объекте содержится ссылка на другой объект О, то при его копировании создается также копия объекта О. А при создании неполной копии осуществляется копирование одних только членов, но не объектов, на которые эти члены ссылаются.
Так, после создания неполной копии объекта, ссылающегося на другой объект О, копия и оригинал будут ссылаться на один и тот же объект О, причем любые изменения в объекте О будут оказывать влияние как на копию, так и на оригинал. Как правило, метод С1опе () реализуется для получения полной копии. А неполные копии могут быть созданы с помощью метода МетЬегифяеС1опе (), определенного в классе ОЬ1 еег.
Ниже приведен пример программы, в которой демонстрируется применение интерфейса 1С1опеаЬ1е. В ней создается класс Те я с, содержащий ссылку на объект класса Х. В самом классе Теяс используется метод С1опе () для создания полной копии. О продемонстрировать применение интерфейса 1С1опеаЬ1е. аятпд яуятеи; с1аяя Х ( рвЫтс ьпг а; рагс Х(ьпт х) ( а = х; ) ) с1аяя Таят : 1С1опааЫе ( 780 Часть И. Библиотека С() роЫ око; роЫгс гпс Ь; роЫгс ТеяС(гпС х, гпС у) ( о '= лен Х(х); у~ ) роЫгс чосб Ялом(яггтпс папе) ( Сопяо1е.нгтге("Значения объекта " + паве + ": "); Сопяо1е.нгтгеъгпе("о.а: (О), Ь: (1)", о.а, Ь); ) УУ Создать полную копию вызывагяцего объекта.
роЫ1с оЬЯесС С1опе() ( ТеяС Сепр = лен ТеяС(о.а, Ь); гесогп севр) ) ) с1аяя С1опеОево ( ясасгс чогб Ма1п() ( Теяг оЬ1 = лен ТеяС(10, 20)) оЫ .Ялом("оЬ1") Сопяо1е.нгтгеьтпе("Сделать объект оЬ2 копией объекта оЫ .") Теяг оЬ2 = (Теяг) оЫ .С1опе(); оЬ2.ЯЬон("оЬ2"); Сопяо1е.нг1геъвпе("Изменить значение оЫ .о.а на 99, а значение оЫ .Ь вЂ” на 88."); оЫ .о.а = 99; оЫ.Ь = 88; оЬ1. Ялом ("оЫ") 1 оЬ2 .Ялом ("оЬ2" ); ) ) Ниже приведен результат выполнения этой программы. Значения обьекта оЫ: о.а: 10, Ь: 20 Сделать объект оЬ2 копией объекта оЫ . Значения объекта оЬ2: о.а: 10, Ъ: 20 Изменить значение оЬ1.о.а на 99, а значение оЫ .Ь вЂ” на 88.
Значения объекта оЬ1: о.а: 99, Ь: 88 Значения объекта оЬ2: о.а: 10, Ь: 20 Как следует из результата выполнения приведенной выше программы, объект оЬ2 является копией объекта оЬ1, но это совершенно разные объекты. Изменения в одном из них не оказывают никакого влияния на другой. Это достигается конструированием нового объекта типа те я С, который выделяет новый объект типа Х для копирования. При этом новому экземпляру объекта типа Х присваивается такое же значение, как и у объекта типа Х в оригинале. Глава 21. Пространство имен Вув(еп) 781 Для получения неполной копии достаточно вызвать метод МещЬегыаяеС1опе (), определяемый в классе 0Ь9 есг из метода С1опе () . В качестве упражнения попробуйте заменить метод С1опе () в предыдущем примере программы на следующий его вариант. О Сделать неполную копию вызывающего объекта.