-->

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

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

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

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

В объявлении класса Gen можно указывать любое имя параметра типа, но по традиции выбирается имя Т. К числу других наиболее употребительных имен параметровтипа относятся V и Е. Вы, конечно, вольны использовать и более описательные имена,например TValue или ТКеу. Но в этом случае первой в имени параметра типа принято указывать прописную букву Т.

Далее имя Т используется для объявления переменной ob, как показано в следующей строке кода.Т ob; // объявить переменную типа Т

Как пояснялось выше, имя параметра типа Т служит меткой-заполнителем конкретного типа, указываемого при создании объекта класса Gen. Поэтому переменнаяob будет иметь тип, привязываемый к Т при получении экземпляра объекта класса Gen.Так, если вместо Т указывается тип string, то в экземпляре данного объекта переменная оb будет иметь тип string.

А теперь рассмотрим конструктор класса Gen.public Gen(Т о) { ob = о;}

Как видите, параметр о этого конструктора относится к типу Т. Это означает, чтоконкретный тип параметра о определяется типом, привязываемым к Т при созданииобъекта класса Gen. А поскольку параметр о и переменная экземпляра ob относятсяк типу Т, то после создания объекта класса Gen их конкретный тип окажется одним итем же.

С помощью параметра типа Т можно также указывать тип, возвращаемый методом, как показано ниже на примере метода GetOb().public Т GetOb() { return ob;}

Переменная ob также относится к типу Т, поэтому ее тип совпадает с типом, возвращаемым методом GetOb().

Метод ShowType() отображает тип параметра Т, передавая его оператору typeof.Но поскольку реальный тип подставляется вместо Т при создании объекта класса Gen,то оператор typeof получит необходимую информацию о конкретном типе.В классе GenericsDemo демонстрируется применение обобщенного класса Gen.

Сначала в нем создается вариант класса Gen для типа int.Gen<int> iOb;

Внимательно проанализируем это объявление. Прежде всего обратите внимание нато, что тип int указывается в угловых скобках после имени класса Gen. В этом случаеint служит аргументом типа, привязанным к параметру типа Т в классе Gen. В данномобъявлении создается вариант класса Gen, в котором тип Т заменяется типом int везде, где он встречается. Следовательно, после этого объявления int становится типомпеременной ob и возвращаемым типом метода GetOb().

В следующей строке кода переменной iOb присваивается ссылка на экземпляробъекта класса Gen для варианта типа int.iOb = new Gen<int>(102);

Обратите внимание на то, что при вызове конструктора класса Gen указывается также аргумент типа int. Это необходимо потому, что переменная (в данном случае —iOb), которой присваивается ссылка, относится к типу Gen. Поэтому ссылка, возвращаемая оператором new, также должна относиться к типу Gen. В противномслучае во время компиляции возникнет ошибка. Например, приведенное ниже присваивание станет причиной ошибки во время компиляции.iOb = new Gen<double>(118.12); // Ошибка!

Переменная iOb относится к типу Gen и поэтому не может использоватьсядля ссылки на объект типа Gen. Такой контроль типов относится к одним изглавных преимуществ обобщений, поскольку он обеспечивает типовую безопасность.Затем в программе отображается тип переменной ob в объекте iOb — тип System.Int32. Это структура .NET, соответствующая типу int. Далее значение переменной obполучается в следующей строке кода.int v = iOb.GetOb();

Возвращаемым для метода GetOb() является тип Т, который был заменен на типint при объявлении переменной iOb, и поэтому метод GetOb() возвращает значениетого же типа int. Следовательно, данное значение может быть присвоено переменнойv типа int.

Далее в классе GenericsDemo объявляется объект типа Gen<string>.Gen<string> strOb = new Gen<string>("Обобщения повышают эффективность.");

В этом объявлении указывается аргумент типа string, поэтому в объекте класса Genвместо Т подставляется тип string. В итоге создается вариант класса Gen для типа string,как демонстрируют остальные строки кода рассматриваемой здесь программы.

Прежде чем продолжить изложение, следует дать определение некоторым терминам. Когда для класса Gen указывается аргумент типа, например int или string, тосоздается так называемый в C# закрыто сконструированный тип. В частности, Genявляется закрыто сконструированным типом. Ведь, по существу, такой обобщенныйтип, как Gen, является абстракцией. И только после того, как будет сконструирован конкретный вариант, например Gen, создается конкретный тип. А конструкция, подобная Gen, называется в C# открыто сконструированным типом, посколькув ней указывается параметр типа Т, но не такой конкретный тип, как int.

В С# чаще определяются такие понятия, как открытый и закрытый типы. Открытым типом считается такой параметр типа или любой обобщенный тип, для которогоаргумент типа является параметром типа или же включает его в себя. А любой тип, неотносящийся к открытому, считается закрытым. Сконструированным типом считаетсятакой обобщенный тип, для которого предоставлены все аргументы типов. Если всеэти аргументы относятся к закрытым типам, то такой тип считается закрыто сконструированным. А если один или несколько аргументов типа относятся к открытым типам,то такой тип считается открыто сконструированным.Различение обобщенных типов по аргументам типа

Что касается обобщенных типов, то следует иметь в виду, что ссылка на один конкретный вариант обобщенного типа не совпадает по типу с другим вариантом того жесамого обобщенного типа. Так, если ввести в приведенную выше программу следующую строку кода, то она не будет скомпилирована.iOb = strOb; // Неверно!

Несмотря на то что обе переменные, iOb и strOb, относятся к типу Gen, ониссылаются на разные типы, поскольку у них разные аргументы.Повышение типовой безопасности с помощью обобщений

В связи с изложенным выше возникает следующий резонный вопрос: если аналогичные функциональные возможности обобщенного класса Gen можно получить и безобобщений, просто указав объект как тип данных и выполнив надлежащее приведениетипов, то какая польза от того, что класс Gen делается обобщенным? Ответ на этот вопрос заключается в том, что обобщения автоматически обеспечивают типовую безопасность всех операций, затрагивающих класс Gen. В ходе выполнения этих операцийобобщения исключают необходимость обращаться к приведению типов и проверятьсоответствие типов в коде вручную.

Для того чтобы стали более понятными преимущества обобщений, рассмотримсначала программу, в которой создается необобщенный аналог класса Gen.// Класс NonGen является полным функциональным аналогом// класса Gen, но без обобщений.using System;class NonGen { object ob; // переменная ob теперь относится к типу object // Передать конструктору ссылку на объект типа object. public NonGen(object о) { ob = о; } // Возвратить объект типа object. public object GetOb() { return ob; } // Показать тип переменной ob. public void ShowType() { Console.WriteLine("Тип переменной ob: " + ob.GetType()); }}// Продемонстрировать применение необобщенного класса.class NonGenDemo { static void Main() { NonGen iOb; // Создать объект класса NonGen. iOb = new NonGen(102); // Показать тип данных, хранящихся в переменной iOb. iOb.ShowType(); // Получить значение переменной iOb. // На этот раз потребуется приведение типов. int v = (int) iOb.GetOb(); Console.WriteLine("Значение: " + v); Console.WriteLine(); // Создать еще один объект класса NonGen и // сохранить строку в переменной it. NonGen strOb = new NonGen("Тест на необобщенность"); // Показать тип данных, хранящихся в переменной strOb. strOb.ShowType(); // Получить значение переменной strOb. //И в этом случае требуется приведение типов. String str = (string) strOb.GetOb(); Console.WriteLine("Значение: " + str); // Этот код компилируется, но он принципиально неверный! iOb = strOb; // Следующая строка кода приводит к исключительной // ситуации во время выполнения. // v = (int) iOb.GetOb(); // Ошибка при выполнении! }}

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