Добавить в цитаты Настройки чтения

Страница 368 из 502

public static void KeepAlive(object obj) Создает ссылку на объект obj, защищая его от “сборки мусора”. Действие этой ссылки оканчивается после выполнения метода KeepAlive()

public static void RegisterForFullGCNotification(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 millisecondsTimeout) - Ожидает уведомления о том, что долженпроизойти полный цикл “сборки мусора", в течение времени, задаваемого пара метром millisecondsTimeout. Здесь GCNotificationStatus — перечисление, определенное в пространстве имен System

public static GCNotificationStatus WaitForFullGCComplete() - Ожидает уведомления о завершении полного цикла “сборки мусора". Здесь GCNotificationStatus — перечисление, определенное в пространстве имен System

public static GCNotificationStatus WaitForFullComplete (int millisecondsTimeout) - Ожидает уведомления о завершении полного цикла "сборки мусора" в течение времени, задаваемого параметром millisecondsTimeout. Здесь GCNotificationStatus — перечисление, определенное в пространстве имен System

public static void WaitForPendingFinalizers() - Прекращает выполнение вызывающего потока до тех пор, пока не будут выполнены все вызванные и незавершенные деструкторы

Кроме того, в классе GC определяется следующее доступное только для чтения свойство:

<b>public static int MaxGeneration { get; }</b>

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

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

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

Класс object

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

<b>public Object()</b>

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

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

Метод - Назначение

public virtual bool Equals(object obj) - Возвращает логическое значение true, если вызывающий объект оказывается таким же, как и объект, определяемый параметром obj. В противном случае возвращается значение false

public static bool Equals(object obj A, object objB) - Возвращает логическое значение true, если объект obj А оказывается таким же, как и объект objB. В противном случае возвращается значение false

protected Finalize() - Выполняет завершающие действия перед процессом “сборки мусора”. В C# метод Finalize() доступен через деструктор

public virtual int GetHashCode() - Возвращает хеш-код, связанный с вызывающим объектом

public Type GetType() - Получает тип объекта во время выполнения программы

protected object MemberwiseClone() - Создает “неполную” копию объекта. При этом копируются члены, но не объекты, на которые ссылаются эти члены

public static bool ReferenceEquals(object objA, object objB) - Возвращает логическое значение true, если объекты obj А и objB ссылаются на один и тот же объект. В противном случае возвращается логическое значение false

public virtual string ToString() - Возвращает строку, описывающую объект

Класс Tuple

В версии .NET Framework 4.0 внедрен удобный способ создания групп объектов (так называемых кортежей). В основу этого способа положен статический класс Tuple, в котором определяется несколько вариантов метода Create() для создания кортежей, а также различные обобщенные классы типа Tuple&lt;. . . &gt;, в которых инкапсулируются кортежи. В качестве примера ниже приведено объявление варианта метода Create(), возвращающего кортеж с тремя членами.