Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»
Шрифт:
Интервал:
Закладка:
Об отражении и метаданных уже говорилось в первой вводной лекции, и эта тема будет обсуждаться и далее. А сейчас я приведу пример, демонстрирующий получение подробной информации о методах и полях класса. Первым делом следует упростить в проекте использование классов пространства имен Reflection, добавив в начало проекта предложение using System.Reflection.
В класс Testing я добавил существенно расширенный вариант метода WhoIsWho, который уже появлялся в наших примерах. Вот текст новой версии этой процедуры:
/// <summary>
/// Подробная информация о классе объекта, его значении,
/// методах класса, всех членов класса
/// </summary>
/// <param name="nаmе">имя объекта</param>
/// <param name="any">объект любого типа</param>
public void WhoIsWho(string name,object any)
{
Type t = any.GetType();
Console.WriteLine("Тип {0}: {1}, значение: {2}",
name, any.GetType(), any.ToString ());
Console.WriteLine("Методы класса: ");
MethodInfo[] ClassMethods = t.GetMethods();
foreach (Methodlnfo curMethod in ClassMethods)
{
Console.WriteLine(curMethod);
}
Console.WriteLine("Все члены класса: ");
MemberInfo[] ClassMembers = t.GetMembers();
foreach (Memberlnfo curMember in ClassMembers)
{
Console.WriteLine(curMember.ToString ());
}
}//WhoIsWho
Коротко прокомментирую эту процедуру. Вначале создается переменная t типа Tуре. Значением этой переменной будет тип аргумента, переданного в процедуру в качестве значения параметра any. Напомню, any имеет базовый тип object и потому метод может быть вызван с аргументом, роль которого может играть выражение любого типа. Далее вызываются методы переменной t — GetMethods () и GetMembers (). Эти методы соответственно возвращают в качестве значений массивы элементов классов MethodInfo и MemberInfo. Эти классы содержатся в пространстве имен Reflection, они хранят информацию в первом случае о методах класса, во втором — о полях и методах класса, заданного переменной t. В пространстве имен Reflection имеются и другие классы, чьи методы и свойства полезны для получения дополнительной информации об исследуемом классе. Но я не буду сейчас столь подробно развивать эту тему.
В процедуре Main дважды вызывается процедура WhoIsWho. В первом вызове ее аргументом является выражение типа double, во втором — сам объект ts, вызывающий метод:
ts.WhoIsWho("2+2.5", 2+2.5);
ts.WhoIsWho("ts", ts);
И класс double, и созданный в этом проекте класс Testing имеют довольно много методов. Имеют они и свойства. Процедура WhoIsWho выдаст подробную информацию обо всех элементах этих классов. Результаты консольного вывода, полученного при двух вызовах этой процедуры, показаны на рис. 6.2.
Рис. 6.2. Информация о классах int и Testing, полученная в процедуре WhoIsWho
Рассмотрим выводимую информацию о классах. Для созданного в проекте класса Testing отображается информация о полях и методах как собственных, так и наследуемых от общего родителя — класса Object. Заметьте, отображается информация только об открытых полях и методах класса, а поскольку поля нашего класса закрыты, то и информации о них нет.
Класс Int подробно обсуждался в предыдущей и в этой лекции. Все методы, которые могут вызывать переменные (объекты) класса Int, были уже рассмотрены. Тем не менее, из выводимой информации можно узнать и нечто новое, поскольку выдаются сведения и о статических полях и методах класса.
Статические поля и методы арифметических классов
Все арифметические классы, в том числе класс Int, обладают двумя полезными полями (свойствами) — MinVaiue и MaxVaiue. Эти поля возвращают минимальное и максимальное значение, которое могут иметь экземпляры класса. Поля являются статическими и потому недоступны для экземпляров класса и могут быть вызваны только при указании имени класса. Разумно привести пример вызова этих полей для класса Int и, например, для класса Double:
//Min и Мах значения типов
Console.WriteLine("Class int");
Console.WriteLine("Мин. значение int = " + int.MinVaiue);
Console.WriteLine("Макс. значение int = " + int.MaxVaiue);
Console.WriteLine("Class double");
Console.WriteLine("Мин. значение double = " + double.MinVaiue);
Console.WriteLine("Макс. значение double = " + double.MaxVaiue);
Все арифметические классы, в том числе класс Int, обладают перегруженным статическим методом Parse, у которого первым обязательным параметром является строка, задающая значение соответствующего арифметического типа в привычной для данного региона (локализованной) форме. Форматом строки и стилем ее представления можно управлять с помощью других параметров метода Parse. Вот пример вызова этого метода для классов Int и Double;
/// <summary>
/// Преобразования типа с использованием метода Parse
/// </summary>
public void Parsing ()
{
//method Parse
Console.WriteLine("Введите целое");
string strdata = Console.ReadLine();
int intdata = int.Parse(strdata);
Console.WriteLine("Введите число с дробной частью и порядком");
strdata = Console.ReadLine();
double doubdata = double.Parse(strdata);
Console.WriteLine("intdata = {0}; doubdata = {1}",
intdata, doubdata);
}
//Parsing
Как видите, метод Parse с успехом заменяет соответствующий метод класса Convert.
На рис. 6.3 можно увидеть консольный вывод, полученный в результате работы процедуры Parsing.
Рис. 6.3. Результаты работы процедуры Parsing
Операция new
Пора вернуться к основной теме — операциям, допустимым в языке С#. Последней из еще не рассмотренных операций высшего уровня приоритета является операция new. Ключевое слово new используется в двух контекстах — как модификатор и как операция в инициализирующих выражениях объявителя. Во втором случае результатом выполнения операции new является создание нового объекта и вызов соответствующего конструктора. Примеров подобного использования операции new было приведено достаточно много, в том числе и в этой лекции.
Арифметические операции
В языке C# имеются обычные для всех языков арифметические операции — "+, -, *, /, Все они перегружены. Операции "+" и могут быть унарными и бинарными. Операция деления "/" над целыми типами осуществляет деление нацело, для типов с плавающей и фиксированной точкой — обычное деление. Операция определена над всеми арифметическими типами и возвращает остаток от деления нацело. Тип результата зависит от типов операндов. Приведу пример вычислений с различными арифметическими типами:
/// <summary>
/// Арифметические операции
/// </summary>
public void Ariphmetica()
{
int n = 7,m =3, p,q;
p= n/m; q= p*m + n%m;