-->

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

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

Метод GetParameters() возвращает список параметров, связанных с анализируемым методом. Ниже приведена его общая форма.ParameterInfо[] GetParameters();

Сведения о параметрах содержатся в объекте класса ParameterInfо. В классеParameterInfо определено немало свойств и методов, описывающих параметры.Особое значение имеют два свойства: Name — представляет собой строку, содержащуюимя параметра, a ParameterType — описывает тип параметра, который инкапсулирован в объекте класса Туре.

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

Эта программа дает следующий результат.Анализ методов, определенных в классе MyClassПоддерживаемые методы:Int32 Sum()Boolean IsBetween(Int32 i)Void Set(Int32 a, Int32 b)Void Set(Double a, Double b)Void Show()String ToString()Boolean Equals(Object obj)Int32 GetHashCode()Type GetType()

Как видите, помимо методов, определенных в классе MyClass, в данной программевыводятся также методы, определенные в классе object, поскольку все типы данных вC# наследуют от класса object. Кроме того, в качестве имен типов указываются именаструктуры .NET. Обратите также внимание на то, что метод Set() выводится дважды,поскольку он перегружается. Один из его вариантов принимает аргументы типа int,а другой — аргументы типа double.

Рассмотрим эту программу более подробно. Прежде всего следует заметить, чтов классе MyClass определен открытый конструктор и ряд открытых методов, в томчисле и перегружаемый метод Set().

Объект класса Туре, представляющий класс MyClass, создается в методе Main() вследующей строке кода.Type t = typeof(MyClass); // получить объект класса Туре, // представляющий класс MyClass

Напомним, что оператор typeof возвращает объект класса Туре, представляющийконкретный тип данных (в данном случае — класс MyClass).

С помощью переменной t и прикладного интерфейса Reflection API в даннойпрограмме затем выводятся сведения о методах, поддерживаемых в классе MyClass.Для этого в приведенной ниже строке кода сначала выводится список соответствующих методов.MethodInfo[] mi = t.GetMethods();

Затем в цикле foreach организуется обращение к элементам массива mi. На каждом шаге этого цикла выводится возвращаемый тип, имя и параметры отдельного метода, как показано в приведенном ниже фрагменте кода.foreach(MethodInfo m in mi) { // Вывести возвращаемый тип и имя каждого метода. Console.Write(" " + m.ReturnType.Name + " " + m.Name + "("); // Вывести параметры. ParameterInfo[] pi = m.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(", "); }}

В этом фрагменте кода параметры, связанные с каждым методом, сначала создаются с помощью метода GetParameters() и сохраняются в массиве pi. Затем в циклеfor происходит обращение к элементам массива pi и выводится тип и имя каждого параметра. Самое главное, что все эти сведения создаются динамически во времявыполнения программы, не опираясь на предварительную осведомленность о классеMyClass.Вторая форма метода GetMethods()

Существует вторая форма метода GetMethods(), позволяющая указывать различные флажки для отфильтровывания извлекаемых сведений о методах. Ниже приведена эта общая форма метода GetMethods().MethodInfo[] GetMethods(BindingFlags флажки)

В этом варианте создаются только те методы, которые соответствуют указаннымкритериям. BindingFlags представляет собой перечисление. Ниже перечислен ряднаиболее часто используемых его значений.ЗначениеОписаниеDeclaredOnlyИзвлекаются только те методы, которые определены в заданном классе. Унаследованные методы в извлекаемые сведения не включаютсяInstanceИзвлекаются методы экземпляраNonPublicИзвлекаются методы, не являющиеся открытымиPublicИзвлекаются открытые методыStaticИзвлекаются статические методы

Два или несколько флажков можно объединить с помощью логической операцииИЛИ. Но как минимум флажок Instance или Static следует указывать вместе сфлажком Public или NonPublic. В противном случае не будут извлечены сведенияни об одном из методов.

Форма BindingFlags метода GetMethods() чаще всего применяется для получения списка методов, определенных в классе, без дополнительного извлечения наследуемых методов. Это особенно удобно в тех случаях, когда требуется исключить получение сведений о методах, определяемых в классе конкретного объекта. В качествепримера попробуем выполнить следующую замену в вызове метода GetMethods() изпредыдущей программы.// Теперь получаются сведения только о тех методах,// которые объявлены в классе MyClass.MethodInfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);

После этой замены программа дает следующий результат.Анализ методов, определенных в классе MyClassПоддерживаемые методы:Int32 Sum()Boolean IsBetween(Int32 i)Void Set(Int32 a, Int32 b)Void Set(Double a, Double b)Void Show()

Как видите, теперь выводятся только те методы, которые явно определены в классеMyClass.Вызов методов с помощью рефлексии

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

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

Для вызова конкретного метода достаточно вызвать метод Invoke() для экземпляра объекта типа MethodInfo, получаемого при вызове метода GetMethods(). Этапроцедура демонстрируется в приведенном ниже примере программы.// Вызвать методы с помощью рефлексии.using System;using System.Reflection;class MyClass { int x; int y; public MyClass(int i, int j) { x = i; У = j; } 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; у = (int) b; Show(); } public void Show() { Console.WriteLine("Значение x: {0}, значение у: {1}", x, у); }}class InvokeMethDemo { static void Main() { Type t = typeof(MyClass); MyClass reflectOb = new MyClass(10, 20); int val; Console.WriteLine("Вызов методов, определенных в классе " + t.Name); 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)) { 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); } 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); } } }}

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