Полное руководство. С# 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] для удаления материала
extern возвращаемыйтип имяметода(список_аргументов);Обратите внимание на отсутствие фигурных скобок.В данном варианте ключевое слово extern нередко применяется вместе с атрибутом DllImport, обозначающим библиотеку DLL, в которой содержится внешнийметод. Атрибут DllImport принадлежит пространству имен System.Runtime.InteropServices. Он допускает несколько вариантов, но, как правило, достаточноуказать лишь имя библиотеки DLL, в которой содержится внешний метод. Вообще говоря, внешние методы следует программировать на С. (Если же это делается на С++, тоимя внешнего метода может быть изменено в библиотеке DLL путем дополнительногооформления типов.)Для того чтобы стало понятнее, как пользоваться внешними методами, обратимсяк примеру конкретной программы, состоящей из двух файлов. Ниже приведен исходный код С из первого файла ExtMeth.с, где определяется метод AbsMax().include
int __declspec(dllexport) AbsMax(int a, int b) { return abs(a) < abs(b) ? abs(b) : abs(a);}В методе AbsMax() сравниваются абсолютные значения двух его параметров и возвращается самое большое из них. Обратите внимание на обозначение _declspec(dllexport). Это специальное расширение языка С для программныхсредств корпорации Microsoft. Оно уведомляет компилятор о необходимости экспортировать метод AbsMax() из библиотеки DLL, в которой он содержится. Для компилирования файла ExtMeth.с в командной строке указывается следующее.
CL /LD /MD ExtMeth.сВ итоге создается библиотечный файл DLL — ExtMeth.dll.Далее следует программа на С#, в которой применяется внешний методAbsMax().
using System;using System.Runtime.InteropServices;
class ExternMeth {// Здесь объявляется внешний метод.[DllImport("ExtMeth.dll")]public extern static int AbsMax(int a, int b);static void Main() { // Использовать внешний метод. int max = AbsMax(-10, —20); Console.WriteLine(max);}
}Обратите внимание на использование атрибута DllImport в приведенной вышепрограмме. Он уведомляет компилятор о наличии библиотеки DLL, содержащейвнешний метод AbsMax(). В данном случае это файл ExtMeth.dll, созданный во время компиляции файла с исходным текстом метода AbsMax() на С. В результате выполнения данной программы на экран, как и ожидалось, выводится значение 20.#### Объявление псевдонима внешней сборкиВо втором применении ключевое слово extern предоставляет псевдоним длявнешней сборки, что полезно в тех случаях, когда в состав программы включаются двеотдельные сборки с одним и тем же именем элемента. Так, если в сборке test1 содержится класс MyClass, а в сборке test2 класс с таким же именем, то при обращении кклассу по этому имени в одной и той же программе может возникнуть конфликт.Для разрешения подобного конфликта необходимо создать псевдоним каждойсборки. Это делается в два этапа. На первом этапе нужно указать псевдонимы, используя параметр компилятора /r, как в приведенном ниже примере.
/r:Asm1=test1/r:Asm2=test2А на втором этапе необходимо ввести операторы с ключевым словом extern, в которых делается ссылка на указанные выше псевдонимы. Ниже приведена форма такогооператора для создания псевдонима сборки.
extern alias имя_сборки;Если продолжить приведенный выше пример, то в программе должны появитьсяследующие строки кода.
extern alias Asm1;extern alias Asm2;Теперь оба варианта класса MyClass будут доступны в программе по соответствующему псевдониму.Рассмотрим полноценный пример программы, в которой демонстрируется применение внешних псевдонимов. Эта программа состоит из трех файлов. Ниже приведенисходный текст, который следует поместить в первый файл — test1.cs.
using System;
namespace MyNS { public class MyClass { public MyClass() { Console.WriteLine("Конструирование из файла MyClass1.dll."); } }}Далее следует исходный текст из файла test2.cs.
using System;
namespace MyNS { public class MyClass { public MyClass() { Console.WriteLine("Конструирование из файла MyClass2.dll."); } }}Обратите внимание на то, что в обоих файлах, test1.cs и test2.cs, объявляетсяпространство имен MyNS и что именно в этом пространстве в обоих файлах определяется класс MyClass. Следовательно, без псевдонима оба варианта класса MyClassбудут недоступными ни одной из программ.И наконец, ниже приведен исходный текст из третьего файла test3.cs, где используются оба варианта класса MyClass из файлов test1.cs и test2.cs. Это становится возможным благодаря операторам с внешними псевдонимами.
// Операторы с внешними псевдонимами должны быть указаны в самом начале файла.extern alias Asm1;extern alias Asm2;using System;
class Demo { static void Main() { Asm1::MyNS.MyClass t = new Asm1::MyNS.MyClass(); Asm2::MyNS.MyClass t2 = new Asm2::MyNS.MyClass(); }}Сначала следует скомпилировать файлы test1.cs и test2.cs в их библиотечныеэквиваленты DLL. Для этого достаточно ввести в командной строке следующее.
csc /t:library test1.cscsc /t:library test2.csЗатем необходимо скомпилировать файл test3.cs, указав в командной строке
csc /r:Asm1=test1.dll /r:Asm2=test2.dll test3.csОбратите внимание на применение параметра /r, уведомляющего компиляторо том, что ссылка на метаданные находится в соответствующем файле. В данном случае псевдоним Asm1 связывается с файлом test1.dll, а псевдоним Asm2 — с файломtest2.dll.В самой программе псевдонимы указываются в приведенных ниже операторахс модификатором extern, которые располагаются в самом начале файла.
extern alias Asm1;extern alias Asm2;А в методе Main() псевдонимы используются для разрешения неоднозначностиссылок на класс MyClass. Обратите внимание на следующее применение псевдонимадля обращения к классу MyClass.
Asm1::MyNS.MyClassВ этой строке кода первым указывается псевдоним, затем оператор разрешенияпространства имен, далее имя пространства имен, в котором находится класс с неоднозначным именем, и, наконец, имя самого класса, следующее после оператора-точки.Та же самая общая форма пригодна и для других внешних псевдонимов.Ниже приведен результат выполнения данной программы.
Конструирование из файла MyClass1.dll.Конструирование из файла MyClass2.dll.```
ГЛАВА 21. Пространство имен System
В этой главе речь пойдет о пространстве имен System.Это пространство имен самого верхнего уровня в библиотеке классов для среды .NET Framework. В немнепосредственно находятся те классы, структуры, интерфейсы, делегаты и перечисления, которые чаще всего применяются в программах на C# или же считаются неотъемлемой частью среды .NET Framework. Таким образом, пространство имен System составляет ядро рассматриваемойздесь библиотеки классов.
Кроме того, в пространство имен System входит многовложенных пространств имен, поддерживающих отдельные подсистемы, например System.Net. Некоторые изэтих пространств имен рассматриваются далее в этой книге. А в этой главе речь пойдет только о членах самого пространства имен System.Члены пространства имен System
Помимо большого количества классов исключений, в пространстве имен содержатся приведенные ниже классы.ActivationContextActivatorAppDomainAppDomainManagerAppDomainSetupApplicationldApplicationldentityArrayAssemblyLoadEventArgsAttributeAttributeUsageAttributeBitConverterBufferCharEnumeratorCLSCompliantAttributeConsoleConsoleCancelEventArgsContextBoundObjectContextStaticAttributeConvertDBNullDelegateEnumEnvironmentEventArgsExceptionFileStyleUriParserFlagsAttributeFtpStyleUriParserGCGenericUriParserGopherStyleUriParserHttpStyleUriParserLazy<T>Lazy<T, TMetadata>LdapStyleUriParserLoaderOptimizationAttributeLocalDataStoreSlotMarshalByRefObjectMathMTAThreadAttributeMulticastDelegateNetPipeStyleUriParserNetTcpStyleUriParserNewsStyleUriParserNonSerializedAttributeNullableObjectObsoleteAttributeOperatingSystemParamArrayAttributeRandomResolveEventArgsSerializableAttributeSTAThreadAttributeStringStringComparerThreadStaticAttri bute TimeZone TimeZonelnfoTimeZonelnfoAdjustmentRuleTuple Tuple<...> (различные формы)TypeUnhandledExceptionEventArgs UriUriBuilderUriParser UriTemplateUriTemplateEquivalenceComparerUriTemplateMatchUriTemplateTableUriTypeConverterValueTypeVersionWeakReference