Полное руководство. С# 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] для удаления материала
Атрибут Obsolete (сокращенное наименование класса System.ObsoleteAttribute)позволяет пометить элемент программы как устаревший. Ниже приведена общая форма этого атрибута:[Obsolete("сообщение")]
где сообщение выводится при компилировании элемента программы, помеченногокак устаревший. Ниже приведен краткий пример применения данного атрибута.// Продемонстрировать применение атрибута Obsolete.using System;class Test { [Obsolete("Лучше использовать метод MyMeth2.")] public static int MyMeth(int a, int b) { return a / b; } // Усовершенствованный вариант метода MyMeth. public static int MyMeth2(int a, int b) { return b == 0 ? 0 : a/b; } static void Main() { // Для этого кода выводится предупреждение. Console.WriteLine("4 / 3 равно " + Test.MyMeth(4, 3)); // А для этого кода предупреждение не выводится. Console.WriteLine("4 / 3 равно " + Test.MyMeth2(4, 3)); }}
Когда по ходу компиляции программы в методе Main() встречается вызов методаMyMeth(), формируется предупреждение, уведомляющее пользователя о том, что емулучше воспользоваться методом MyMeth2().
Ниже приведена вторая форма атрибута Obsolete:[Obsolete("сообщение", ошибка)]
где ошибка обозначает логическое значение. Если это значение истинно (true), то прииспользовании устаревшего элемента формируется сообщение об ошибке компиляции вместо предупреждения. Эта форма отличается тем, что программа, содержащаяподобную ошибку, не будет скомпилирована в исполняемом виде.
ГЛАВА 18. Обобщения
Эта глава посвящена обобщениям — одному из самыхсложных и эффективных средств С#. Любопытно,что обобщения не вошли в первоначальную версию1.0 и появились лишь в версии 2.0, но теперь они являютсянеотъемлемой частью языка С#. Не будет преувеличениемсказать, что внедрение обобщений коренным образом изменило характер С#. Это нововведение не только означалопоявление нового элемента синтаксиса данного языка, но иоткрыло новые возможности для внесения многочисленныхизменений и обновлений в библиотеку классов. И хотя после внедрения обобщений прошло уже несколько лет, последствия этого важного шага до сих пор сказываются наразвитии С# как языка программирования.
Обобщения как языковое средство очень важны потому,что они позволяют создавать классы, структуры, интерфейсы, методы и делегаты для обработки разнотипных данныхс соблюдением типовой безопасности. Как вам должнобыть известно, многие алгоритмы очень похожи по своейлогике независимо от типа данных, к которым они применяются. Например, механизм, поддерживающий очередь,остается одинаковым независимо от того, предназначена лиочередь для хранения элементов типа int, string, objectили для класса, определяемого пользователем. До появления обобщений для обработки данных разных типов приходилось создавать различные варианты одного и того жеалгоритма. А благодаря обобщениям можно сначала выработать единое решение независимо от конкретного типаданных, а затем применить его к обработке данных самыхразных типов без каких-либо дополнительных усилий.
В этой главе описываются синтаксис, теория и практика применения обобщений,а также показывается, каким образом обобщения обеспечивают типовую безопасностьв ряде случаев, которые раньше считались сложными. После прочтения настоящейглавы у вас невольно возникнет желание ознакомиться с материалом главы 25, посвященной коллекциям, так как в ней приведено немало примеров применения обобщений в классах обобщенных коллекций.Что такое обобщения
Термин обобщение, по существу, означает параметризированный тип. Особая рольпараметризированных типов состоит в том, что они позволяют создавать классы,структуры, интерфейсы, методы и делегаты, в которых обрабатываемые данные указываются в виде параметра. С помощью обобщений можно, например, создать единыйкласс, который автоматически становится пригодным для обработки разнотипныхданных. Класс, структура, интерфейс, метод или делегат, оперирующий параметризированным типом данных, называется обобщенным, как, например, обобщенный классили обобщенный метод.
Следует особо подчеркнуть, что в C# всегда имелась возможность создавать обобщенный код, оперируя ссылками типа object. А поскольку класс object являетсябазовым для всех остальных классов, то по ссылке типа object можно обращатьсяк объекту любого типа. Таким образом, до появления обобщений для оперированияразнотипными объектами в программах служил обобщенный код, в котором для этойцели использовались ссылки типа object.
Но дело в том, что в таком коде трудно было соблюсти типовую безопасность, поскольку для преобразования типа object в конкретный тип данных требовалось приведение типов. А это служило потенциальным источником ошибок из-за того, чтоприведение типов могло быть неумышленно выполнено неверно. Это затруднение позволяют преодолеть обобщения, обеспечивая типовую безопасность, которой раньшетак недоставало. Кроме того, обобщения упрощают весь процесс, поскольку исключают необходимость выполнять приведение типов для преобразования объекта или другого типа обрабатываемых данных. Таким образом, обобщения расширяют возможности повторного использования кода и позволяют делать это надежно и просто.
ПРИМЕЧАНИЕПрограммирующим на C++ и Java необходимо иметь в виду, что обобщения в C# не следует путать с шаблонами в C++ и обобщениями в Java, поскольку это разные, хотя и похожиесредства. В действительности между этими тремя подходами к реализации обобщений существуют коренные различия. Если вы имеете некоторый опыт программирования на C++ илиJava, то постарайтесь на основании этого опыта не делать никаких далеко идущих выводово том, как обобщения действуют в С#.Простой пример обобщений
Начнем рассмотрение обобщений с простого примера обобщенного класса. В приведенной ниже программе определяются два класса. Первым из них является обобщенный класс Gen, вторым — класс GenericsDemo, в котором используется класс Gen.// Простой пример обобщенного класса.using System;// В приведенном ниже классе Gen параметр типа Т заменяется// реальным типом данных при создании объекта типа Gen.class Gen<T> { Т ob; // объявить переменную типа Т // Обратите внимание на то, что у этого конструктора имеется параметр типа Т. public Gen(T о) { ob = о; } // Возвратить переменную экземпляра ob, которая относится к типу Т. public Т GetOb() { return ob; } // Показать тип Т. public void ShowType() { Console.WriteLine("К типу T относится " + typeof(Т)); }}// Продемонстрировать применение обобщенного класса.class GenericsDemo { static void Main() { // Создать переменную ссылки на объект Gen типа int. Gen<int> iOb; // Создать объект типа Gen<int> и присвоить ссылку на него переменной iOb. iOb = new Gen<int>(102); // Показать тип данных, хранящихся в переменной iOb. iOb.ShowType(); // Получить значение переменной iOb. int v = iOb.GetOb(); Console.WriteLine("Значение: " + v); Console.WriteLine(); // Создать объект типа Gen для строк. Gen<string> strOb = new Gen<string>("Обобщения повышают эффективность."); // Показать тип данных, хранящихся в переменной strOb. strOb.ShowType(); // Получить значение переменной strOb. string str = strOb.GetOb(); Console.WriteLine("Значение: " + str); }}
Эта программа дает следующий результат.К типу Т относится System.Int32Значение: 102К типу Т относится System.StringЗначение: Обобщения повышают эффективность.
Внимательно проанализируем эту программу. Прежде всего обратите внимание наобъявление класса Gen в приведенной ниже строке кода:class Gen<T> {
где Т — это имя параметра типа. Это имя служит в качестве метки-заполнителя конкретного типа, который указывается при создании объекта класса Gen. Следовательно,имя Т используется в классе Gen всякий раз, когда требуется параметр типа. Обратитевнимание на то, что имя Т заключается в угловые скобки (< >). Этот синтаксис можно обобщить: всякий раз, когда объявляется параметр типа, он указывается в угловыхскобках. А поскольку параметр типа используется в классе Gen, то такой класс считается обобщенным.