Полное руководство. С# 4.0
Полное руководство. С# 4.0 читать книгу онлайн
В этом полном руководстве по C# 4.0 — языку программирования, разработанному специально для среды .NET, — детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.
В данной книге вы найдете:- Полное описание средств языка C#- Подробное рассмотрение новых средств в версии C# 4.0, в том числе PLINQ, библиотеку TPL, именованные и необязательные аргументы, динамический тип данных и многое другое- Сотни простых и понятных примеров программ с комментариями.- Самый полный источник информации по C#Благодаря поддержке параллельного языка интегрированных запросов (PLINQ) и библиотеки распараллеливания задач (TPL) версия 4.0 стала новой вехой в программировании на C#, и поэтому Герберт Шилдт, автор лучших книг по программированию, обновил и расширил свое классическое руководство, чтобы охватить в нем эти и другие нововведения. В книге подробно описываются языковые средства C#, даются профессиональные рекомендации и приводятся сотни примеров программ, охватывающих все аспекты программирования на C#, включая синтаксис, ключевые слова и основные библиотеки, не говоря уже о таких новшествах, как PLINQ, TPL, динамический тип данных, а также именованные и необязательные аргументы.Это необходимое каждому программирующему на C# справочное руководство написано простым и доступным языком, благодаря которому Герберт Шилдт стал таким популярным. В книге найдут ответы на насущные вопросы по C# как начинающие, так и опытные программисты.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Для генерирования последовательного ряда случайных чисел служит класс 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,0protected 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 24 41 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 до,generationpublic static void Collect(int generation, GCCollectionMode mode)Инициализирует,процесс "сборки мусора" в областях памяти с номерами поколений от 0,до generation в режиме, определяемом параметром modepublic static int CollectionCount(int generation)Возвращает,количество операций “сборки мусора”, выполненных в области памяти с номером,поколения generationpublic 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 до 99public static void RemoveMemoryPressure(long bytesAllocated)Задает в качестве,параметра bytesAllocated количество байтов, освобождаемых в неуправляемой,области памятиpublic static void ReRegisterForFinalize(object obj)Вызывает деструктор,для объекта obj. Этот метод аннулирует действие метода SuppressFinalize()public static void SuppressFinalize(object obj)Препятствует вызову,деструктора для объекта objpublic static GCNotificationStatus WaitForFullGCApproach()Ожидает уведомления,о том, что должен произойти полный цикл “сборки мусора”. Здесь,GCNotificationStatus — перечисление, определенное в пространстве имен Systempublic static GCNotificationStatus WaitForFullGCApproach(int milliseconds Timeout)Ожидает уведомления,о том, что должен произойти полный цикл “сборки мусора”, в течение времени,,задаваемого параметром millisecondsTimeout. Здесь GCNotificationStatus — перечисление, определенное в пространстве имен Systempublic static GCNotificationStatus WaitForFullGCComplete()Ожидает уведомления,о завершении полного цикла “сборки мусора”. Здесь GCNotificationStatus —,перечисление, определенное в пространстве имен Systempublic static GCNotificationStatus WaitForFullGCComplete(int milliseconds Timeout)Ожидает уведомления,о завершении полного цикла "сборки мусора” в течение времени,,задаваемого параметром millisecondsTimeout. Здесь GCNotif icationStatus — перечисление, определенное в пространстве имен Systempublic static void WaitForPendingFinalizers()Прекращает выполнение вызывающего потока до тех пор, пока не будут выполнены все вызванные и незавершенные деструкторы
Кроме того, в классе GC определяется следующее доступное только для чтениясвойство:public static int MaxGeneration { get; }
Свойство MaxGeneration содержит максимальный номер поколения, доступныйдля системы. Номер поколения обозначает возраст выделенной области памяти. Чемстарше выделенная область памяти, тем больше номер ее поколения. Номера поколений позволяют повысить эффективность работы системы "сборки мусора".
В большинстве приложений возможности класса GC не используются. Но в особыхслучаях они оказываются весьма полезными. Допустим, что требуется организоватьпринудительную "сборку мусора" с помощью метода Collect() в выбранный момент времени. Как правило, "сборка мусора" происходит в моменты, не указываемыеспециально в программе. А поскольку для ее выполнения требуется некоторое время,то желательно, чтобы она не происходила в тот момент, когда решается критичная повремени задача. С другой стороны, "сборку мусора" и другие вспомогательные операции можно выполнить во время простоя программы. Имеется также возможностьрегистрировать уведомления о приближении и завершении "сборки мусора".
Для проектов с неуправляемым кодом особое значение имеют два следующих метода из класса GC:AddMemoryPressure() и RemoveMemoryPressure(). С их помощьюуказывается большой объем неуправляемой памяти, выделяемой или освобождаемойв программе. Особое значение этих методов состоит в том, что система управленияпамятью не контролирует область неуправляемой памяти. Если программа выделяет большой объем неуправляемой памяти, то это может сказаться на производительности, поскольку системе ничего неизвестно о таком сокращении объема свободнодоступной памяти. Если же большой объем неуправляемой памяти выделяется с помощью метода AddMemoryPressure(), то система CLR уведомляется о сокращенииобъема свободно доступной памяти. А если выделенная область памяти освобождается с помощью метода RemoveMemoryPressure(), то система CLR уведомляется о соответствующем восстановлении объема свободно доступной памяти. Следует, однако,иметь в виду, что метод RemoveMemoryPressure() необходимо вызывать только дляуведомления об освобождении области неуправляемой памяти, выделенной с помощью метода AddMemoryPressure().Класс object