-->

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

На нашем литературном портале можно бесплатно читать книгу Полное руководство. С# 4.0, Шилдт Герберт-- . Жанр: Программирование. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Полное руководство. С# 4.0
Название: Полное руководство. С# 4.0
Дата добавления: 16 январь 2020
Количество просмотров: 269
Читать онлайн

Полное руководство. С# 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] для удаления материала

Перейти на страницу:

Ниже приведен пример применения обобщенного интерфейса IComparable.В этом примере вызывается метод InRange(), возвращающий логическое значениеtrue, если объект оказывается среди элементов отсортированного массива.// Требуется обобщенный интерфейс IComparable<T>. В данном методе// предполагается, что массив отсортирован. Он возвращает логическое// значение true, если значение параметра what оказывается среди элементов// массива, передаваемых параметру obs.public static bool InRange<T>(T what, T[] obs) where T : IComparable<T> { if(what.CompareTo(obs[0]) < 0 || what.CompareTo(obs[obs.Length-1]) > 0) return false; return true;}

В приведенном ниже примере программы демонстрируется применение обоихметодов IsIn() и InRange() на практике.// Продемонстрировать применение обобщенных// интерфейсов IComparable<T> и IEquatable<T>.using System;// Теперь в классе MyClass реализуются обобщенные// интерфейсы IComparable<T> и IEquatable<T>.class MyClass : IComparable<MyClass>, IEquatable<MyClass> { public int Val; public MyClass(int x) { Val = x; } // Реализовать обобщенный интерфейс IComparable<T>. public int CompareTo(MyClass other) { return Val - other.Val; // Now, no cast is needed. } // Реализовать обобщенный интерфейс IEquatable<T>. public bool Equals(MyClass other) { return Val == other.Val; } // Переопределить метод Equals(Object). public override bool Equals(Object obj) { if(obj is MyClass) return Equals((MyClass) obj); return false; } // Переопределить метод GetHashCode(). public override int GetHashCode() { return Val.GetHashCode(); }}class CompareDemo { // Требуется обобщенный интерфейс IEquatable<T>. public static bool IsIn<T>(T what, T[] obs) where T : IEquatable<T> { foreach(T v in obs) if(v.Equals(what)) // Применяется метод Equals() return true; return false; } // Требуется обобщенный интерфейс IComparable<T>. В данном методе // предполагается, что массив отсортирован. Он возвращает логическое // значение true, если значение параметра what оказывается среди элементов // массива, передаваемых параметру obs. public static bool InRange<T>(T what, T[] obs) where T : IComparable<T> { if(what.CompareTo(obs[0]) < 0 || what.CompareTo(ob?[obs.Length-1]) > 0) return false; return true; } // Продемонстрировать операции сравнения. static void Main() { // Применить метод IsIn() к данным типа int. int[] nums = { 1, 2, 3, 4, 5 }; if(IsIn(2, nums)) Console.WriteLine("Найдено значение 2."); if(IsIn(99, nums)) Console.WriteLine("He подлежит выводу."); // Применить метод IsIn() к объектам класса MyClass. MyClass[] mcs = { new MyClass(1), new MyClass(2), new MyClass(3), new MyClass(4) ); if(IsIn(new MyClass()), mcs)) Console.WriteLine("Найден объект MyClass())."); if(IsIn(new MyClass(99), mcs)) Console.WriteLine("He подлежит выводу."); // Применить метод InRange() к данным типа int. if(InRange(2, nums)) Console.WriteLine("Значение 2 находится в границах массива nums."); if(InRange(1, nums)) Console.WriteLine("Значение 1 находится в границах массива nums."); if(InRange(5, nums)) Console.WriteLine("Значение 5 находится в границах массива nums."); if(!InRange(0, nums)) Console.WriteLine("Значение 0 HE находится в границах массива nums."); if(!InRange(6, nums)) Console.WriteLine("Значение 6 HE находится в границах массива nums."); // Применить метод InRange() к объектам класса MyClass. if(InRange(new MyClass(2), mcs)) Console.WriteLine("Объект MyClass(2) находится в границах массива nums."); if(InRange(new MyClass(1), mcs)) Console.WriteLine("Объект MyClass(1) находится " + "в границах массива nums."); if(InRange(new MyClass(4), mcs)) Console.WriteLine("Объект MyClass(4) находится " + "в границах массива nums."); if(!InRange(new MyClass(0), mcs)) Console.WriteLine("Объект MyClass(0) HE " + "находится в границах массива nums."); if (!InRange(new MyClass(5), mcs)) Console.WriteLine("Объект MyClass (5) HE " + "находится в границах массива nums."); }}

Выполнение этой программы приводит к следующему результату.Найдено значение 2.Найден объект MyClass(3).Значение 2 находится в границах массива nums.Значение 1 находится в границах массива nums.Значение 5 находится в границах массива nums.Значение 0 НЕ находится в границах массива numsЗначение 6 НЕ находится в границах массива numsОбъект MyClass(2) находится в границах массива nums.Объект MyClass(1) находится в границах массива nums.Объект MyClass(4) находится в границах массива nums.Объект MyClass(0) НЕ находится в границах массива nums.Объект MyClass(5) НЕ находится в границах массива nums.

ПРИМЕЧАНИЕЕсли параметр типа обозначает ссылку или ограничение на базовый класс, то к экземплярамобъектов, определяемых таким параметром типа, можно применять операторы == и !=, хотя онипроверяют на равенство только ссылки. А для сравнения значений придется реализовать интерфейс IComparable или же обобщенные интерфейсы IComparable и lEquatable.Иерархии обобщенных классов

Обобщенные классы могут входить в иерархию классов аналогично необобщеннымклассам. Следовательно, обобщенный класс может действовать как базовый или производный класс. Главное отличие между иерархиями обобщенных и необобщенныхклассов заключается в том, что в первом случае аргументы типа, необходимые обобщенному базовому классу, должны передаваться всеми производными классами вверхпо иерархии аналогично передаче аргументов конструктора.Применение обобщенного базового класса

Ниже приведен простой пример иерархии, в которой используется обобщенныйбазовый класс.// Простая иерархия обобщенных классов.using System;// Обобщенный базовый класс.class Gen<T> { Т ob; public Gen(T о) { ob = о; } // Возвратить значение переменной ob. public Т GetOb() { return ob; }}// Класс, производный от класса Gen.class Gen2<T> : Gen<T> { public Gen2(T o) : base(o) { // ... }}class GenHierDemo { static void Main() { Gen2<string> g2 = new Gen2<string>("Привет"); Console.WriteLine(g2.GetOb()); }}

В этой иерархии класс Gen2 наследует от обобщенного класса Gen. Обратите внимание на объявление класса Gen2 в следующей строке кода.class Gen2<T> : Gen<T> {

Параметр типа Т указывается в объявлении класса Gen2 и в то же время передаетсяклассу Gen. Это означает, что любой тип, передаваемый классу Gen2, будет передаваться также классу Gen. Например, в следующем объявлении:Gen2<string> g2 = new Gen2<string>("Привет");

параметр типа string передается классу Gen. Поэтому переменная ob в той частикласса Gen2, которая относится к классу Gen, будет иметь тип string.Обратите также внимание на то, что в классе Gen2 параметр типа Т не используется, а только передается вверх по иерархии базовому классу Gen. Это означает, чтов производном классе следует непременно указывать параметры типа, требующиесяего обобщенному базовому классу, даже если этот производный класс не обязательнодолжен быть обобщенным.

Разумеется, в производный класс можно свободно добавлять его собственные параметры типа, если в этом есть потребность. В качестве примера ниже приведен вариант предыдущей иерархии классов, где в класс Gen2 добавлен собственный параметр типа.// Пример добавления собственных параметров типа в производный класс.using System;// Обобщенный базовый класс.class Gen<T> { Т ob; // объявить переменную типа Т // Передать конструктору ссылку типа Т. public Gen(T о) { ob = о; } // Возвратить значение переменной ob. public Т GetOb() { return ob; }}// Класс, производный от класса Gen. В этом классе// определяется второй параметр типа V.class Gen2<T, V> : Gen<T> { V ob2; public Gen2(T о, V o2) : base(о) { ob2 = o2; } public V GetObj2() { return ob2; }}// Создать объект класса Gen2.class GenHierDemo2 { static void Main() { // Создать объект класса Gen2 с параметрами // типа string и int. Gen2<string, int> x = new Gen2<string, int>("Значение равно: ", 99); Console.Write(x.GetOb()); Console.WriteLine(x.GetObj2()); }}

Перейти на страницу:
Комментариев (0)
название