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

ЖАНРЫ

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

Класс BitConverter является статическим. Он содержит методы, приведенные в табл. 21.13. Кроме того, в нем определено следующее поле. public static readonly bool IsLittleEndian

Это поле принимает логическое значение true, если в текущей среде сначала со храняется младший байт слова, а затем старший. Это так называемый формат с пря мым порядком байтов. А если в текущей среде сначала сохраняется старший байт слова, а затем младший, то поле IsLittleEndian принимает логическое значение false. Это так называемый формат с обратным порядком байтов. В компьютерах с процессором Intel Pentium используется формат с прямым порядком байтов.

Таблица 21.13. Методы, определенные в классе BitConverter Метод Назначение public static long DoubleToInt64Bits(double value) Преобразует значение value в целочисленное значение типа long и возвращает результат public static byte[] GetBytes(bool value) Преобразует значение value в однобайтовый массив и возвращает результат public static byte[] GetBytes(char value) Преобразует значение value в двухбайтовый массив и возвращает результат public static byte[] GetBytes(double value) Преобразует значение value в восьмибайтовый массив и возвращает результат public static byte[] GetBytes(float value) Преобразует значение value в четырехбайтовый массив и возвращает результат public static byte[] GetBytes(int value) Преобразует значение value в четырехбайтовый массив и возвращает результат public static byte[] GetBytes(long value) Преобразует значение value в восьмибайтовый массив и возвращает результат public static byte[] GetBytes(short value)

Преобразует значение value в двухбайтовый массив и возвращает результат public static byte[] GetBytes(uint value) Преобразует значение value в четырехбайтовый массив и возвращает результат public static byte[] GetBytes(ulong value) Преобразует значение value в восьмибайтовый массив и возвращает результат public static byte[] GetBytes(ushort value) Преобразует значение value в двухбайтовый массив и возвращает результат public static double Int64BitsToDouble(long value) Преобразует значение value в значение типа double и возвращает результат public static bool ToBoolean(byte[] value, int startIndex) Преобразует байт из элемента массива, указываемого по индексу value[startIndex], в эквивалентное значение типа bool и возвращает результат. Ненулевое значение преобразуется в логическое значение true, а нулевое — в логическое значение false public static char ToChar(byte[] value, int index) Преобразует два байта, начиная с элемента массива value[index], в эквивалентное значение типа char и возвращает результат public static double ToDouble(byte[] value, int startIndex) Преобразует восемь байтов, начиная с элемента массива value[startIndex], в эквивалентное значение типа double и возвращает результат public static short ToInt16(byte[] value, int startIndex) Преобразует два байта, начиная с элемента массива value[startIndex], в эквивалентное значение типа short и возвращает результат public static int ToInt32(byte[] value, int startIndex) Преобразует четыре байта, начиная с элемента массива value[startIndex], в эквивалентное значение типа int и возвращает результат public static long ToInt64(byte[] value, int startIndex) Преобразует восемь байтов, начиная с элемента массива value[startIndex], в эквивалентное значение типа long и возвращает результат public static float ToSingle(byte[] value, int startIndex) Преобразует четыре байта, начиная с элемента массива value[startIndex], в эквивалентное значение типа float и возвращает результат public static string ToString(byte[] value) Преобразует байты из массива value в символьную строку. Строка содержит шестнадцатеричные значения, связанные с этими байтами и разделенные дефисами public static string ToString(byte[] value, int startIndex) Преобразует байты из массива value в символьную строку, начиная с элемента value[startIndex]. Строка содержит шестнадцатеричные значения, связанные с этими байтами и разделенные дефисами public static string ToString(byte[] value, int startIndex, int length) Преобразует байты из массива value в символьную строку, начиная с элемента value[startIndex] и включая число элементов, определяемых параметром length. Строка содержит шестнадцатеричные значения, связанные с этими байтами и разделенные дефисами public static ushort ToUInt16(byte[] value, int startIndex) Преобразует два байта, начиная с элемента массива value[startIndex], в эквивалентное значение типа ushort и возвращает результат public static uint ToUInt32(byte[] value, int startIndex) Преобразует четыре байта, начиная с элемента массива value[startIndex], в эквивалентное значение типа uint и возвращает результат public static ulong ToUInt64(byte[] value, int startIndex) Преобразует восемь байтов, начиная с элемента массива value[startIndex], в эквивалентное значение типа ulong и возвращает результат Генерирование случайных чисел средствами класса Random

Для генерирования последовательного ряда случайных чисел служит класс Random. Такие последовательности чисел оказываются полезными в самых разных ситуациях, включая имитационное моделирование. Начало последовательности случайных чисел определяется некоторым начальным числом, которое может задаваться автоматически или указываться явным образом.

В классе Random определяются два конструктора. public Random public Random(int seed)

Первый конструктор создает объект типа Random, использующий системное время для определения начального числа. А во втором конструкторе используется начальное значение seed, задаваемое явным образом.

Методы, определенные в классе Random, перечислены в табл. 21.14.

Таблица 21.14. Методы, определенные в классе Random Метод Назначение public virtual int Next Возвращает следующее случайное целое число, которое будет находиться в пределах от 0 до Int32. MaxValue-1 включительно public virtual int Next(int maxValue) Возвращает следующее случайное целое число, которое будет находиться в пределах от 0 до maxValue-1 включительно public virtual int Next(int minValue, int maxValue) Возвращает следующее случайное целое число, которое будет находиться в пределах от minValue до maxValue-1 включительно public virtual void NextBytes(byte[] buffer) Заполняет массив buffer последовательностью случайных целых чисел. Каждый байт в массиве будет находиться в пределах от 0 до Byte.MaxValue-1 включительно public virtual double NextDouble Возвращает из последовательности следующее случайное число, которое представлено в форме с плавающей точкой, больше или равно 0,0 и меньше 1,0 protected virtual double Sample Возвращает из последовательности следующее случайное число, которое представлено в форме с плавающей точкой, больше или равно 0,0 и меньше 1,0. Для получения несимметричного или специального распределения случайных чисел этот метод необходимо переопределить в производном классе

Ниже приведена программа, в которой применение класса 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) Задает в качестве,параметра 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>

Поделиться с друзьями: