Чтение онлайн

на главную - закладки

Жанры

Полное руководство. С# 4.0
Шрифт:

В классе GC инкапсулируются средства "сборки мусора". Методы, определенные в этом классе, перечислены в табл. 21.15.

Таблица 21.15. Методы, определенные в классе GC Метод Назначение public static voidAddMemoryPressure(long bytesAllocated) Задает в качестве,параметра bytesAllocatedколичество байтов, распределенных в неуправляемой,области памяти public static void CancelFullGCNotification Отменяет,уведомление о “сборке мусора” public static void Collect Инициализирует процесс “сборки мусора” public static void Collect(int generation) Инициализирует,процесс “сборки мусора” в областях памяти с номерами поколений от 0 до,generation public static void Collect(int generation, GCCollectionMode mode) Инициализирует,процесс "сборки мусора" в областях памяти с номерами поколений от 0,до generation в режиме, определяемом параметром mode public static int CollectionCount(int generation) Возвращает,количество операций “сборки мусора”, выполненных в области памяти с номером,поколения generation public static int GetGeneration(object obj) Возвращает номером,поколения для области памяти, доступной по ссылке obj,td> public static int GetGeneration(WeakReference wo) Возвращает номер,поколения для

области памяти, доступной по "слабой” ссылке, задаваемой,параметром wo. Наличие "слабой” ссылки не защищает объект от “сборки,мусора” public static long GetTotalMemory(bool forceFullCollection) Возвращает общий,объем памяти (в байтах), выделенной на данный момент. Если параметр,forceFullCollection имеет логическое значение true, то сначала выполняется,“сборка мусора” public static void KeepAlive(object obj) Создает ссылку на,объект obj, защищая его от “сборки мусора”. Действие этой ссылки оканчивается, после выполнения метода KeepAlive public static void Regist erForFullGCNotification(int maxGenerationThreshold, int largeObjectHeapThreshold) Разрешает,уведомление о "сборке мусора”. Значение параметра maxGenerationThreshold,обозначает количество объектов второго поколения в обычной “куче”, которые,будут инициировать уведомление. А значение параметра largeObjectHeapThreshold,обозначает количество объектов в крупной “куче”, которые будут инициировать,уведомление. Оба значения должны быть указаны в пределах от 1 до 99 public static void RemoveMemoryPressure(long bytesAllocated) Задает в качестве,параметра bytesAllocated количество байтов, освобождаемых в неуправляемой,области памяти public static void ReRegisterForFinalize(object obj) Вызывает деструктор,для объекта obj. Этот метод аннулирует действие метода SuppressFinalize public static void SuppressFinalize(object obj) Препятствует вызову,деструктора для объекта obj public static GCNotificationStatus WaitForFullGCApproach Ожидает уведомления,о том, что должен произойти полный цикл “сборки мусора”. Здесь,GCNotificationStatus — перечисление, определенное в пространстве имен System public static GCNotificationStatus WaitForFullGCApproach(int milliseconds Timeout) Ожидает уведомления,о том, что должен произойти полный цикл “сборки мусора”, в течение времени,,задаваемого параметром millisecondsTimeout. Здесь GCNotificationStatus — перечисление, определенное в пространстве имен System public static GCNotificationStatus WaitForFullGCComplete Ожидает уведомления,о завершении полного цикла “сборки мусора”. Здесь GCNotificationStatus —,перечисление, определенное в пространстве имен System public static GCNotificationStatus WaitForFullGCComplete(int milliseconds Timeout) Ожидает уведомления,о завершении полного цикла "сборки мусора” в течение времени,,задаваемого параметром millisecondsTimeout. Здесь GCNotif icationStatus — перечисление, определенное в пространстве имен System public static void WaitForPendingFinalizers Прекращает выполнение вызывающего потока до тех пор, пока не будут выполнены все вызванные и незавершенные деструкторы

Кроме того, в классе GC определяется следующее доступное только для чтения свойство: public static int MaxGeneration { get; }

Свойство MaxGeneration содержит максимальный номер поколения, доступный для системы. Номер поколения обозначает возраст выделенной области памяти. Чем старше выделенная область памяти, тем больше номер ее поколения. Номера поколе ний позволяют повысить эффективность работы системы "сборки мусора".

В большинстве приложений возможности класса GC не используются. Но в особых случаях они оказываются весьма полезными. Допустим, что требуется организовать принудительную "сборку мусора" с помощью метода Collect в выбранный мо мент времени. Как правило, "сборка мусора" происходит в моменты, не указываемые специально в программе. А поскольку для ее выполнения требуется некоторое время, то желательно, чтобы она не происходила в тот момент, когда решается критичная по времени задача. С другой стороны, "сборку мусора" и другие вспомогательные опе рации можно выполнить во время простоя программы. Имеется также возможность регистрировать уведомления о приближении и завершении "сборки мусора".

Для проектов с неуправляемым кодом особое значение имеют два следующих мето да из класса GC:AddMemoryPressure и RemoveMemoryPressure. С их помощью указывается большой объем неуправляемой памяти, выделяемой или освобождаемой в программе. Особое значение этих методов состоит в том, что система управления памятью не контролирует область неуправляемой памяти. Если программа выделя ет большой объем неуправляемой памяти, то это может сказаться на производитель ности, поскольку системе ничего неизвестно о таком сокращении объема свободно доступной памяти. Если же большой объем неуправляемой памяти выделяется с по мощью метода AddMemoryPressure, то система CLR уведомляется о сокращении объема свободно доступной памяти. А если выделенная область памяти освобождает ся с помощью метода RemoveMemoryPressure, то система CLR уведомляется о со ответствующем восстановлении объема свободно доступной памяти. Следует, однако, иметь в виду, что метод RemoveMemoryPressure необходимо вызывать только для уведомления об освобождении области неуправляемой памяти, выделенной с помо щью метода AddMemoryPressure. Класс object

В основу типа object в С# положен класс object. Члены класса Object под робно рассматривались в главе 11, но поскольку он играет главную роль в С#, то его методы ради удобства повторно перечисляются в табл. 21.16. В классе object определен конструктор public Object

который создает пустой объект.

Таблица 21.16. Методы, определенные в классе Object Класс Tuple

В версии .NET Framework 4.0 внедрен удобный способ создания групп объектов (так называемых кортежей). В основу этого способа положен статический класс Tuple, в котором определяется несколько вариантов метода Create для создания корте жей, а также различные обобщенные классы типа Tuple<...>, в которых инкапсу лируются кортежи. В качестве примера ниже приведено объявление варианта метода Create, возвращающего кортеж с тремя членами. Метод Назначение public virtual bool Equals(object obj) Возвращает логическое значение true, если вызывающий объект оказывается таким же, как

и объект, определяемый параметром obj. В противном случае возвращается значение false public static bool Equals(object objA, object objВ) Возвращает логическое значение true, если объект objА оказывается таким же, как и объект objВ. В противном случае возвращается значение false protected Finalize Выполняет завершающие действия перед процессом "сборки мусора". В C# метод Finalize доступен через деструктор public virtual int GetHashCode Возвращает хеш-код, связанный с вызывающим объектом public Type GetType Получает тип объекта во время выполнения программы protected object MemberwiseClone Создает "неполную" копию объекта. При этом копируются члены, но не объекты, на которые ссылаются эти члены public static bool ReferenceEquals(object objA, object objВ) Возвращает логическое значение true, если объекты objА и objВ ссылаются на один и тот же объект. В противном случае возвращается логическое значение false public virtual string ToString Возвращает строку, описывающую объект public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)` Следует заметить, что данный метод возвращает объект типа Tuple<T1, Т2, Т3>, в котором инкапсулируются члены кортежа item1, item2 и item3. Вообще говоря, кортежи оказываются полезными в том случае, если группу значений нужно интерпретировать как единое целое. В частности, кортежи можно передавать методам, возвращать из методов или же сохранять в коллекции либо в массиве. Интерфейсы IComparable и IComparable

Во многих классах приходится реализовывать интерфейс IComparable или IComparable, поскольку он позволяет сравнивать один объект с другим, используя различные методы, определенные в среде .NET Framework. Интерфейсы IComparable и IComparable были представлены в главе 18, где они использовались в примерах программ для сравнения двух объектов, определяемых параметрами обобщенного типа. Кроме того, они упоминались при рассмотрении класса Array ранее в этой гла ве. Но поскольку эти интерфейсы имеют особое значение и применяются во многих случаях, то ниже приводится их краткое описание.

Интерфейс IComparable реализуется чрезвычайно просто, потому что он состоит всего лишь из одного метода. int CompareTo(object obj)

В этом методе значение вызывающего объекта сравнивается со значением объекта, определяемого параметром obj. Если значение вызывающего объекта больше, чем у объекта obj, то возвращается положительное значение; если оба значения равны — нулевое значение, а если значение вызывающего объекта меньше, чем у объекта obj, — отрицательное значение.

Обобщенный вариант интерфейса IComparable объявляется следующим об разом. public interface IComparable<T>

В данном варианте тип сравниваемых данных передается параметру Т в качестве ар гумента типа. В силу этого объявление метода CompareTo претерпевает изменения и выглядит так, как показано ниже. int CompareTo(Т other)

В этом объявлении тип данных, которыми оперирует метод CompareTo, может быть указан явным образом. Следовательно, интерфейс IComparable обеспечи вает типовую безопасность. Именно по этой причине он теперь считается более пред почтительным в программировании на С#, чем интерфейс IComparable. Интерфейс IEquatable

Интерфейс IEquatable<T> реализуется в тех классах, где требуется определить порядок сравнения двух объектов на равенство их значений. В этом интерфейсе опре делен только один метод, Equals, объявление которого приведено ниже. bool Equals(T other)

Этот метод возвращает логическое значение true, если значение вызывающего объекта оказывается равным значению другого объекта other, в противном случае — логическое значение false.

Интерфейс IEquatable реализуется в нескольких классах и структурах среды .NET Framework, включая структуры числовых типов и класс String. Для реализа ции интерфейса IEquatable обычно требуется также переопределять методы Equals(Object) и GetHashCode, определенные в классе Object. Интерфейс IConvertible

Интерфейс IConvertible реализуется в структурах всех типов значений, String и DateTime. В нем определяются различные преобразования типов. Реализовывать этот интерфейс в создаваемых пользователем классах, как правило, не требуется. Интерфейс ICloneable

Реализовав интерфейс ICloneable, можно создать все условия для копирования объекта. В интерфейсе ICloneable определен только один метод, Clone, объявле ние которого приведено ниже. object Clone

В этом методе создается копия вызывающего объекта, а конкретная его реализация зависит от способа создания копии объекта. Вообще говоря, существуют две разно видности копий объектов: полная и неполная. Если создается полная копия, то ко пия совершенно не зависит от оригинала. Так, если в исходном объекте содержится ссылка на другой объект О, то при его копировании создается также копия объекта О. А при создании неполной копии осуществляется копирование одних только членов, но не объектов, на которые эти члены ссылаются. Так, после создания неполной ко пии объекта, ссылающегося на другой объект О, копия и оригинал будут ссылаться на один и тот же объект О, причем любые изменения в объекте О будут оказывать влия ние как на копию, так и на оригинал. Как правило, метод Clone реализуется для получения полной копии. А неполные копии могут быть созданы с помощью метода MemberwiseClone, определенного в классе Object.

Ниже приведен пример программы, в которой демонстрируется применение ин терфейса ICloneable. В ней создается класс Test, содержащий ссылку на объект клас са X. В самом классе Test используется метод Clone для создания полной копии. // Продемонстрировать применение интерфейса ICloneable. using System; class X { public int a; public X(int x) { a = x; } } class Test : ICloneable { public X о; public int b; public Test(int x, int y) { о = new X(x); b = y; } public void Show(string name) { Console.Write("Значения объекта " + name + ": "); Console.WriteLine("о.a: {0}, b: {1}", o.a, b); } // Создать полную копию вызывающего объекта. public object Clone { Test temp = new Test(o.a, b); return temp; } } class CloneDemo { static void Main { Test ob1 = new Test(10, 20); obi.Show("ob1"); Console.WriteLine("Сделать объект ob2 копией объекта оb1."); Test ob2 = (Test) ob1.Clone; ob2.Show("ob2"); Console.WriteLine("Изменить значение оb1.о.а на 99, " + " а значение оb1.b - на 88."); оb1.о.а = 99; оb1.b = 88; оb1.Show("оb1"); ob2.Show("оb2"); } }

Поделиться:
Популярные книги

Жена проклятого некроманта

Рахманова Диана
Фантастика:
фэнтези
6.60
рейтинг книги
Жена проклятого некроманта

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

Демон

Парсиев Дмитрий
2. История одного эволюционера
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Демон

30 сребреников

Распопов Дмитрий Викторович
1. 30 сребреников
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
30 сребреников

Небо в огне. Штурмовик из будущего

Политов Дмитрий Валерьевич
Военно-историческая фантастика
Фантастика:
боевая фантастика
7.42
рейтинг книги
Небо в огне. Штурмовик из будущего

Осознание. Пятый пояс

Игнатов Михаил Павлович
14. Путь
Фантастика:
героическая фантастика
5.00
рейтинг книги
Осознание. Пятый пояс

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Блокада. Знаменитый роман-эпопея в одном томе

Чаковский Александр Борисович
Проза:
военная проза
7.00
рейтинг книги
Блокада. Знаменитый роман-эпопея в одном томе

Цикл "Отмороженный". Компиляция. Книги 1-14

Гарцевич Евгений Александрович
Отмороженный
Фантастика:
боевая фантастика
рпг
постапокалипсис
5.00
рейтинг книги
Цикл Отмороженный. Компиляция. Книги 1-14

Книга 4. Игра Кота

Прокофьев Роман Юрьевич
4. ОДИН ИЗ СЕМИ
Фантастика:
фэнтези
боевая фантастика
рпг
6.68
рейтинг книги
Книга 4. Игра Кота

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Новый Рал 2

Северный Лис
2. Рал!
Фантастика:
фэнтези
7.62
рейтинг книги
Новый Рал 2

Низший 2

Михайлов Дем Алексеевич
2. Низший!
Фантастика:
боевая фантастика
7.07
рейтинг книги
Низший 2

Под маской, или Страшилка в академии магии

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.78
рейтинг книги
Под маской, или Страшилка в академии магии