C# 4.0 полное руководство - 2011 - Герберт Шилдт
Шрифт:
Интервал:
Закладка:
Ниже приведена программа, в которой применение класса Random демонстрируется на примере создания компьютерного варианта пары игральных костей.
// Компьютерный вариант пары играль/ных костей.
using System;
class RandDice {
static void Main() {
Random ran = new Random();
Console.Write(ran.Next(1, 7) + " ");
Console.WriteLine(ran.Next(1, 7));
}
}
При выполнении этой программы три раза подряд могут быть получены, например, следующие результаты.
5 2
4 4
1 6
Сначала в этой программе создается объект класса Random. А затем в ней запрашиваются два случайных значения в пределах от 1 до 6.
Управление памятью и класс GC
В классе GC инкапсулируются средства "сборки мусора". Методы, определенные в этом классе, перечислены в табл. 21.15.
Таблица 21.15. Методы, определенные в классе GC
Метод
Назначение
public static
voidAddMemoryPressure(long bytesAllocated) public static void CancelFullGCNotification () public static void Collect () public static void Collect(int generation)
public static void Collect (int generation, GCCollectionMode mode)
public static int CollectionCount (int generation)
public static int GetGeneration (object obj)
Задает в качестве параметра bytes Allocated количество байтов, распределенных в неуправляемой области памяти Отменяет уведомление о “сборке мусора”
Инициализирует процесс “сборки мусора” Инициализирует процесс “сборки мусора” в областях памяти с номерами поколений от 0 до
generation
Инициализирует процесс “сборки мусора” в областях памяти с номерами поколений от 0 до generation в'режиме, определяемом параметром mode
Возвращает количество операций “сборки мусора”, выполненных в области памяти с номером поколения generation Возвращает номером поколения для области памяти, доступной по ссылке obj
_Продолжение табл. 21.15
Метод
Назначение
public static int
Возвращает номер поколения для области па
GetGeneration(WeakReference wo)
мяти, доступной по “слабой" ссылке, задавае
мой параметром wo. Наличие “слабой" ссылки не защищает объект от “сборки мусора”
public static long
Возвращает общий объем памяти (в байтах),
GetTotalMemory(bool
выделенной на данный момент. Если параметр
forceFullCollection)
forceFullCollection имеет логическое значение true, то сначала выполняется “сборка мусора”
public static void
Создает ссылку на объект obj, защищая
KeepAlive(object obj)
его от “сборки мусора”. Действие этой ссылки оканчивается после выполнения метода
KeepAlive()
public static void Regist
Разрешает уведомление о “сборке мусора”. Зна
erForFullGCNotification(in
чение параметра maxGenerationThreshold
t maxGenerationThreshold, int
обозначает количество объектов второго поко
largeObj ectHeapThreshold)
ления в обычной “куче", которые будут инициировать уведомление. А значение параметра largeObj ectHeapThreshold обозначает количество объектов в крупной “куче", которые будут инициировать уведомление. Оба значения должны быть указаны в пределах от 1 до 99
public static void
Задает в качестве параметра bytesAllocated
RemoveMemoryPressure(long
количество байтов, освобождаемых в неуправ
bytesAllocated)
ляемой области памяти
public static void
Вызывает деструктор для объекта obj.
ReRegisterForFinalize(object
Этот метод аннулирует действие метода
obj)
SuppressFinalize()
public static void
Препятствует вызову деструктора для объекта
SuppressFinalize(object obj)
obj
public static
Ожидает уведомления о том, что должен про
GCNotificationStatus
изойти полный цикл “сборки мусора”. Здесь
WaitForFullGCApproach()
GCNotif icationStatus — перечисление, определенное в пространстве имен System
public static
Ожидает уведомления о том, что должен
GCNotificationStatus
произойти полный цикл “сборки мусора",
WaitForFullGCApproach(int
в течение времени, задаваемого пара
millisecondsTimeout)
метром millisecondsTimeout. Здесь GCNotif icationStatus — перечисление, определенное в пространстве имен System
public static
Ожидает уведомления о завершении
GCNotificationStatus
полного цикла “сборки мусора". Здесь
WaitForFullGCComplete ()
GCNotif icationStatus — перечисление, определенное в пространстве имен System
Кроме того, в классе GC определяется следующее доступное только для чтения свойство:
public static int MaxGeneration { get; }
Свойство MaxGeneration содержит максимальный номер поколения, доступный для системы. Номер поколения обозначает возраст выделенной области памяти. Чем старше выделенная область памяти, тем больше номер ее поколения. Номера поколений позволяют повысить эффективность работы системы " сборки мусора".
В большинстве приложений возможности класса GC не используются. Но в особых случаях они оказываются весьма полезными. Допустим, что требуется организовать принудительную "сборку мусора" с помощью метода Collect () в выбранный момент времени. Как правило, "сборка мусора" происходит в моменты, не указываемые специально в программе. А поскольку для ее выполнения требуется некоторое время, то желательно, чтобы она не происходила в тот момент, когда решается критичная по времени задача. С другой стороны, "сборку мусора" и другие вспомогательные операции можно выполнить во время простоя программы. Имеется также возможность регистрировать уведомления о приближении и завершении "сборки мусора".
Для проектов с неуправляемым кодом особое значение имеют два следующих метода из класса GC: AddMemoryPressure () и RemoveMemoryPressure (). С их помощью указывается большой объем неуправляемой памяти, выделяемой или освобождаемой в программе. Особое значение этих методов состоит в том, что система управления памятью не контролирует область неуправляемой памяти. Если программа выделяет большой объем неуправляемой памяти, то это может сказаться на производительности, поскольку системе ничего неизвестно о таком сокращении объема свободно доступной памяти. Если же большой объем неуправляемой памяти выделяется с помощью метода AddMemoryPressure (), то система CLR уведомляется о сокращении объема свободно доступной памяти. А если выделенная область памяти освобождается с помощью метода RemoveMemoryPressure (), то система CLR уведомляется о соответствующем восстановлении объема свободно доступной памяти. Следует, однако, иметь в виду, что метод RemoveMemoryPressure () необходимо вызывать только для уведомления об освобождении области неуправляемой памяти, выделенной с помощью метода AddMemoryPressure ().
Класс object
В основу типа object в C# положен класс object. Члены класса Object подробно рассматривались в главе 11, но поскольку он играет главную роль в С#, то его методы ради удобства повторно перечисляются в табл. 21.16. В классе object определен конструктор
public Object()
который создает пустой объект.
Таблица 21.16. Методы, определенные в классе Object
Метод
Назначение
public virtual bool
Возвращает логическое значение true, если вы
Equals(object obj)
зывающий объект оказывается таким же, как и объект, определяемый параметром obj. В противном случае возвращается значение false
public static bool Equals(object
Возвращает логическое значение true, если
obj A, object objB)
объект obj А оказывается таким же, как и объект objB. В противном случае возвращается значение false
protected Finalize()