1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 99
Текст из файла (страница 99)
При использовании второй версии конструктора начальное число задаетсяв параметре seed.Методы, определенные в классе Random, перечислены в табл. 19.14.Таблица 19.14. Методы, определенные в классе RandomМетодОписаниеpublic virtual int Next()Возвращает следующее случайное число типа int, котороебудет находиться в диапазоне 0-Int32.MaxValue-1,включительноВозвращает следующее случайное число типа int, котороебудет находиться в диапазоне 0-upperBound-1,включительноВозвращает следующее случайное число типа int, котороебудет находиться в диапазоне lowerBound - upperBound-1,включительноpublic virtual intNext(int upperBound)public virtual intNext(int lowerBound,int upperBound)public virtual voidNextBytes(byte[] buf)public virtual doubleNextDouble()protected virtual doubleSample()Заполняет буфер buf последовательностью случайных целыхчисел.
Каждый байт в массиве будет находиться в диапазоне0-Byte.MaxValue-1, включительноВозвращает следующее случайное число изпоследовательности (представленное в форме с плавающейточкой), которое будет больше или равно числу 0,0 и меньше1,0Возвращает следующее случайное число изпоследовательности (представленное в форме с плавающейточкой), которое будет больше или равно числу 0,0 и меньше1,0. Чтобы создать несимметричное или специализированноераспределение, этот метод необходимо переопределить апроизводном классеРассмотрим программу, в которой демонстрируется использование класса Randomпосредством создания парных результатов игры в кости:// Автоматизированная игра в кости,using System;class RandDice {}public 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.Глава 19.
Пространство имен System535Управление памятью и класс GCВ классе GC инкапсулировано C#-средство сбора мусора. Методы, определенные вэтом классе, представлены в табл. 19.15. В нем также определено следующее свойство,предназначенное только для чтения:public static int MaxGeneration { get; }Свойство MaxGeneration содержит номер поколения самой старой областивыделенной памяти. При каждом выделении памяти (т.е при использовании оператора new)новой выделяемой области присваивается номер поколения, равный нулю Номера,соответствующие ранее выделенным областям памяти, при этом увеличиваются.Следовательно, свойство MaxGeneration означает номер области памяти, которая былавыделена раньше других Наличие номеров поколений способствует повышениюэффективности процесса сбора мусора.В большинстве приложений программисты не пользуются возможностями класса GC.Но в отдельных случаях они могут оказаться весьма полезными Например, методCollect() позволяет выполнять сбор мусора в удобное для вас время.
Обычно этопроисходит в моменты, неизвестные вашей программе. Но поскольку процесс сбора мусоразанимает некоторое время, у вас могут быть вполне обоснованные причины для того, чтобыэто не происходило при выполнении критических с точки зрения времени задач, либо выхотели бы для сбора мусора и других вспомогательных операций использоватьвынужденные периоды ожидания (простоя).GC — это sealed-класс, т.е он не может иметь потомковТаблица 19.15. Методы, определенные в классе GСМетодОписаниеpublic static voidCollect()public static voidCollect(int MaxGen)public static intGetGeneration(object o)public static intGetGeneration(WeakReference o)Инициализирует процесс сбора мусораpublic static longGetTotalMemory(bool collect)public static voidKeepAlive(object o)public static voidReRegisterForFmalize(object o)public static voidSuppressFinalize(object o)public static voidWaitForPendingFinalizers()536Инициализирует процесс сбора мусора для областейпамяти с номерами поколений от 0 до MaxGenВозвращает номер поколения для области памяти, накоторую ссылается параметр оВозвращает номер поколения для области памяти,адресуемой "слабой" ссылкой, заданной параметром оНаличие "слабой" ссылки не защищает объект от угрозыподвергнуться процессу сбора мусораВозвращает общий объем выделенной памяти (в байтах)на данный момент Если параметр collect равензначению true, до выдачи результата выполняется сбормусораСоздает ссылку на объект о, тем самым защищая его отугрозы подвергнуться операции сбора мусораВызывает выполнение деструктора Этот методаннулирует действие Метода SuppressFinalize()Препятствует выполнению деструктораПрекращает выполнение вызывающего потока до тех пор,пока не будут выполнены все незаконченные деструкторыЧасть II.
Библиотека C#Класс ObjectObject — это класс, который лежит в основе C#-типа object. Члены классаObject рассматривались в главе 11, но ввиду его центральной роли в C# (и ради удобствачитателя) его методы снова приводятся в табл. 19.16. В классе Object определен одинконструктор:Object()Этот конструктор создает пустой объект.Таблица 19.16. Методы, определенные в классе ObjectМетодНазначениеpublic virtual bool Equals(object ob)Возвращает значение true, если вызывающий объектявляется таким же, как объект, адресуемый параметром ob.
Впротивном случае возвращает значение falseВозвращает значение true, если объект ob1 является такимже, как объект ob2. В противном случае возвращает значениеfalseВыполняет завершающие действия перед процессом сборамусора. В C# метод Finalize() доступен через деструкторВозвращает хеш-код, связанный с вызывающим объектомpublic static bool Equals(object ob1,object ob2)protected Finalize()public virtual intGetHashCode()public Type GetType()protected objectMemberwiseClone()public static boolReferenceEquals(object ob1,object ob2)public virtual stringToString()Получает тип объекта во время выполнения программыВыполняет "поверхностное копирование" объекта, т.е.копируются члены, но не объекты, на которые ссылаются этичленыВозвращает значение true, если объекты ob1 и ob2ссылаются на один и тот же объект. В противном случаевозвращает значение falseВозвращает строку, которая описывает объектИнтерфейс IComparableВо многих классах необходимо реализовать интерфейс IComparable, поскольку онс помощью методов, определенных в C#-библиотеке, позволяет сравнить два объекта.Интерфейс IComparable легко реализовать, поскольку он состоит только из одногометода:int CompareTo(object v)Этот метод сравнивает вызывающий объект со значением параметра v.
Методвозвращает положительное число, если вызывающий объект больше объекта v, нуль, еслидва сравниваемых объекта равны, и отрицательное число, если вызывающий объект меньшеобъекта v.Глава 19. Пространство имен System537Интерфейс IConvertibleИнтерфейс IConvertible реализован всеми структурами нессылочных типов. Онопределяет преобразование типов. Как правило, в создаваемых программистами классахэтот интерфейс реализовать не нужно.Интерфейс ICloneableРеализуя интерфейс ICloneable, вы позволяете создавать копию объекта. Винтерфейсе ICloneable определен только один метод:object Clone()Этот метод создает копию вызывающего объекта.
От того, как реализован методClone(), зависит вид создаваемой копии. Существует два вида копий: детальная иповерхностная. При создании копии первого вида копия и оригинал совершеннонезависимы. Следовательно, если исходный объект содержит ссылку на другой объект O, тов результате детального копирования будет также создана копия объекта O. Вповерхностной копии копируются члены, но не объекты, на которые ссылаются эти члены.Если объект ссылается на другой объект O, то по окончании поверхностного копированиякак копия, так и исходный объект будут ссылаться на один и тот же объект O, и любыеизменения, вносимые в объект O, отразятся и на копии, и на оригинале. Обычно метод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 o;public int b;public Test(int x, int y) {o = new X(x);b = y;}public void show(string name) {Console. Write("Значения объекта " + name + " : ");Console.WriteLine("o.a: {0}, b: {1}", o.a, b);}538Часть II.