-->

Полное руководство. С# 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Сумма равна 30Значение 14 находится между х и уВ методе Set(int, int). Значение х: 9, значение у: 18В методе Set(double, double). Значение х: 1, значение у: 23Значение х: 1, значение у: 23

Рассмотрим подробнее порядок вызова методов. Сначала создается список методов.Затем в цикле foreach извлекаются сведения об их параметрах. Далее каждый методвызывается с указанием соответствующего типа и числа аргументов в последовательном ряде условных операторов if/else. Обратите особое внимание на перегрузку метода Set() в приведенном ниже фрагменте кода.if(m.Name.CompareTo("Set")==0 && pi[0].ParameterType == typeof(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)) { object[] args = new object[2]; args[0] = 1.12; args[1] = 23.4; m.Invoke(reflectOb, args);}

Если имя метода — Set, то проверяется тип первого параметра, чтобы выявитьконкретный вариант этого метода. Так, если это метод Set(int, int), то его аргументы загружаются в массив args. В противном случае используются аргументы типаdouble.Получение конструкторов конкретного типа

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

Конструкторы конкретного типа получаются при вызове методаGetConstructors() для объекта класса Туре. Ниже приведена одна из наиболее часто используемых форм этого метода.ConstructorInfо[] GetConstructors()

Метод GetConstructors() возвращает массив объектов класса ConstructorInfо,описывающих конструкторы.

Класс ConstructorInfo является производным от абстрактного классаMethodBase, который в свою очередь наследует от класса MemberInfо. В нем такжеопределен ряд собственных методов. К их числу относится интересующий нас методGetConstructors(), возвращающий список параметров, связанных с конструктором. Этот метод действует таким же образом, как и упоминавшийся ранее методGetParameters(), определенный в классе MethodInfo.

Как только будет обнаружен подходящий конструктор, для создания объекта вызывается метод Invoke(), определенный в классе ConstructorInfo. Ниже приведенаодна из форм этого метода.object Invoke(object[] parameters)

Любые аргументы, которые требуется передать методу, указываются в массиве parameters. Если же аргументы не нужны, то вместо массива parameters указывается пустое значение (null). Но в любом случае количество элементов массиваparameters должно совпадать с количеством передаваемых аргументов, а типы аргументов — с типами параметров. Метод Invoke() возвращает ссылку на сконструированный объект.

В приведенном ниже примере программы рефлексия используется для созданияэкземпляра объекта класса MyClass.// Создать объект с помощью рефлексии.using System;using System.Reflection;class MyClass { int x; int y; public MyClass(int i) { Console.WriteLine("Конструирование класса MyClass(int, int). "); x = у = i; } 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("В методе(double, double). "); x = (int) a; у = (int) b; Show(); } public void Show() { Console.WriteLine("Значение x: {0}, значение у: {1}", x, у); }}class InvokeConsDemo { static void Main() { Type t = typeof(MyClass); int val; // Получить сведения о конструкторе. ConstructorInfо[] 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 х; for(x=0; х < ci.Length; х++) { ParameterInfо[] pi = ci[х].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.WriteLine("nВызов методов для объекта reflectOb."); Console.WriteLine(); MethodInfo[] mi = t.GetMethods(); // Вызвать каждый метод. foreach(MethodInfo m in mi) { // Получить параметры. ParameterInfо[] 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(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

А теперь рассмотрим порядок применения рефлексии для конструирования объекта класса MyClass. Сначала получается перечень открытых конструкторов в следующей строке кода.ConstructorInfо[] ci = t.GetConstructors();

Затем для наглядности примера выводятся полученные конструкторы. После этогоосуществляется поиск по списку конструктора, принимающего два аргумента, как показано в приведенном ниже фрагменте кода.for(x=0; х < ci.Length; х++) { ParameterInfo[] pi = ci[x].GetParameters(); if(pi.Length == 2) break;}

Если такой конструктор найден, как в данном примере, то в следующем фрагментекода получается экземпляр объекта заданного типа.// Сконструировать объект.object[] consargs = new object[2];consargs[0] = 10;consargs[1] = 20;object reflectOb = ci[x].Invoke(consargs);

После вызова метода Invoke() переменная экземпляра reflectOb будет ссылатьсяна объект типа MyClass. А далее в программе выполняются соответствующие методыдля экземпляра этого объекта.

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

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