-->

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

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

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

Как следует из главы 16, сборка несет в себе сведения о типах классов, структури прочих элементов данных, которые в ней содержатся. Прикладной интерфейсReflection API позволяет загрузить сборку, извлечь сведения о ней и получить экземпляры объектов любых открыто доступных в ней типов. Используя этот механизм,программа может выявлять свою среду и использовать те функциональные возможности, которые могут оказаться доступными без явного их определения во время компиляции. Это очень эффективный и привлекательный принцип. Представьте себе,например, программу, которая выполняет роль "браузера типов", отображая типыданных, доступные в системе, или же инструментальное средство разработки, позволяющее визуально составлять программы из различных типов данных, поддерживаемых в системе. А поскольку все сведения о типах могут быть извлечены и проверены,то ограничений на применение рефлексии практически не существует.

Для получения сведений о сборке сначала необходимо создать объект классаAssembly. В классе Assembly открытый конструктор не определяется. Вместо этогообъект класса Assembly получается в результате вызова одного из его методов. Так,для загрузки сборки по заданному ее имени служит метод LoadFrom(). Ниже приведена его соответствующая форма:static Assembly LoadFrom(string файл_сборки)

где файл_сборки обозначает конкретное имя файла сборки.

Как только будет получен объект класса Assembly, появится возможность обнаружить определенные в нем типы данных, вызвав для него метод GetTypes() в приведенной ниже общей форме.Туре[] GetTypes()

Этот метод возвращает массив типов, содержащихся в сборке.

Для того чтобы продемонстрировать порядок обнаружения типов в сборке, потребуются два исходных файла. Первый файл будет содержать ряд классов, обнаруживаемых в коде из второго файла. Создадим сначала файл MyClasses.cs, содержащийследующий код.// Файл, содержащий три класса и носящий имя MyClasses.cs.using System;class MyClass { int x; int y; public MyClass(int i) { Console.WriteLine("Конструирование класса MyClass(int). "); x = у = i; Show(); } public MyClass(int i, int j) { Console.WriteLine("Конструирование класса MyClass(int, int). "); x = i; у = j; Show(); } public int Sum() { return x+y; } public bool IsBetween(int i) { if((x < i) && (i < y)) return true; else return false; } public void Set(int a, int b) { Console.Write("В методе Set(int, int). "); x = a; У = b; Show(); } // Перегрузить метод Set. public void Set(double a, double b) { Console.Write("В методе Set(double, double). "); x = (int) a; y = (int) b; Show(); } public void Show() { Console.WriteLine("Значение x: {0}, значение у: {1}", x, у); }}class AnotherClass { string msg; public AnotherClass(string str) { msg = str; } public void Show() { Console.WriteLine(msg); }}class Demo { static void Main() { Console.WriteLine("Это заполнитель."); }}

Этот файл содержит класс MyClass, неоднократно использовавшийся в предыдущих примерах. Кроме того, в файл добавлены второй класс AnotherClass и третийкласс Demo. Следовательно, сборка, полученная из исходного кода, находящегося вэтом исходном файле, будет содержать три класса. Затем этот файл компилируется, ииз него формируется исполняемый файл MyClasses.ехе. Именно эта сборка и будетопрашиваться программно.

Ниже приведена программа, в которой будут извлекаться сведения о файле сборкиMyClasses.ехе. Ее исходный текст составляет содержимое второго файла./* Обнаружить сборку, определить типы и создать объект с помощью рефлексии. */using System;using System.Reflection;class ReflectAssemblyDemo { static void Main() { int val; // Загрузить сборку MyClasses.exe. Assembly asm = Assembly.LoadFrom("MyClasses.exe"); // Обнаружить типы, содержащиеся в сборке MyClasses.exe. Туре[] alltypes = asm.GetTypes(); foreach(Type temp in alltypes) Console.WriteLine("Найдено: " + temp.Name); Console.WriteLine(); // Использовать первый тип, в данном случае - класс MyClass. Type t = alltypes[0]; // использовать первый найденный класс Console.WriteLine("Использовано: " + t.Name); // Получить сведения о конструкторе. ConstructorInfo[] ci = t.GetConstructors(); Console.WriteLine("Доступные конструкторы: "); foreach(ConstructorInfo с in ci) { // Вывести возвращаемый тип и имя. Console.Write(" " + t.Name + "("); // Вывести параметры. ParameterInfо[] pi = с.GetParameters(); for(int i=0; i < pi.Length; i++) { Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name); if(i+1 < pi.Length) Console.Write(", "); } Console.WriteLine(")"); } Console.WriteLine(); // Найти подходящий конструктор. int x; for(x=0; x < ci.Length; x++) { ParameterInfo[] pi = ci[x].GetParameters(); if(pi.Length == 2) break; } if(x == ci.Length) { Console.WriteLine("Подходящий конструктор не найден."); return; } else Console.WriteLine("Найден конструктор с двумя параметрами.n"); // Сконструировать объект. object[] consargs = new object[2]; consargs[0] = 10; consargs[1] = 20; object reflectOb = ci[x].Invoke(consargs); Console.Write.Line("/nВызов методов для объекта reflectOb."); Console.WriteLine(); MethodInfo[] mi = t.GetMethods(); // Вызвать каждый метод. foreach(MethodInfo m in mi) { // Получить параметры. ParameterInfo[] pi = m.GetParameters(); if(m.Name.CompareTo("Set")==0 && pi[0].ParameterType == typeof(int)) { // Это метод Set(int, int). object[] args = new object[2]; args[0] = 9; args[1] = 18; m.Invoke(reflectOb, args); } else if(m.Name.CompareTo("Set")==0 && pi[0].ParameterType == typeof(double)) { // Это метод Set(double, double). object[] args = new object[2]; args[0] = 1.12; args[1] = 23.4; m.Invoke(reflectOb, args); } else if(m.Name.CompareTo("Sum")==0) { val = (int) m.Invoke(reflectOb, null); Console.WriteLine("Сумма равна " + val); } else if(m.Name.CompareTo("IsBetween")==0) { object[] args = new object[1]; args[0] = 14; if((bool) m.Invoke(reflectOb, args)) Console.WriteLine("Значение 14 находится между x и у"); } else if(m.Name.CompareTo("Show")==0) { m.Invoke(reflectOb, null); } } }}

При выполнении этой программы получается следующий результат.Найдено: MyClassНайдено: AnotherClassНайдено: DemoИспользовано: MyClassДоступные конструкторы: MyClass(Int32 i) MyClass(Int32 i, Int32 j)Найден конструктор с двумя параметрами.Конструирование класса MyClass(int, int)Значение х: 10, значение у: 20Вызов методов для объекта reflectObСумма равна 30Значение 14 находится между х и уВ методе Set(int, int). Значение х: 9, значение у: 18В методе Set(double, double). Значение х: 1, значение у: 23Значение х: 1, значение у: 23

Как следует из результата выполнения приведенной выше программы, обнаружены все три класса, содержащиеся в файле сборки MyClasses.ехе. Первым среди нихобнаружен класс MyClass, который затем был использован для получения экземпляра объекта и вызова соответствующих методов.

Отдельные типы обнаруживаются в сборке MyClasses.ехе с помощью приведенной ниже последовательности кода, находящегося в самом начале метода Маin().// Загрузить сборку MyClasses.exe.Assembly asm = Assembly.LoadFrom("MyClasses.ехе");// Обнаружить типы, содержащиеся в сборке MyClasses.exe.Туре[] alltypes = asm.GetTypes();foreach(Type temp in alltypes) Console.WriteLine("Найдено: " + temp.Name);

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