Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:
}
/// <summary>
/// Перегруженный метод OLoad с двумя параметрами типа long и long
/// </summary>
/// <param name="par1" ></param>
/// <param name="par2"></param> void OLoad(long par1, long par2)
{
Console.WriteLine("long par1 {0}, long par2 {1}", par1, par2);
}
/// <summary>
/// Перегруженный метод OLoad с двумя параметрами типа
/// double и double
/// </summary>
/// <param name="par1" ></param>
/// <param name="par2"></param>
void OLoad(double par1, double par2)
{
Console.WriteLine("double par1 {0}, double par2 {1}",par1, par2);
}
/// <summary>
///
/// int и float
/// </summary>
/// <param name="par1" ></param>
/// <param name="par2"></param> void OLoad(int par1, float par2)
{
Console.WriteLine("int par1 {0}, float par2 {1}",par1, par2);
}
Все эти методы устроены достаточно просто. Они сообщают информацию о типе и значении переданных аргументов. Вот тестирующая процедура, вызывающая метод OLoad с разным числом и типами аргументов:
/// <summary>
/// Вызов перегруженного метода OLoad. В зависимости от
/// типа и числа аргументов вызывается один из методов группы.
/// </summary>
public void OLoadTest
{
OLoad(x); OLoad(ux);
OLoad(y); OLoad(dy);
// OLoad(x,ux);
// conflict: (int, float) и (long,long)
OLoad(x,(float)ux);
OLoad (y,dy); OLoad (x, dy);
}
Заметьте, один из вызовов закомментирован, так как он приводит к конфликту на этапе трансляции. Для устранения конфликта при вызове метода пришлось задать явное преобразование аргумента, что показано в строке, следующей за строкой-комментарием.
Рис. 4.2. Вывод на печать результатов теста OLoadTest
Прежде чем посмотреть на результаты работы тестирующей процедуры, попробуйте понять, какой из перегруженных методов вызывается для каждого из вызовов. В случае каких-либо сомнений используйте схему, приведенную на 4.1.
Приведу все-таки некоторые комментарии. При первом вызове метода тип источника — int, а тип аргумента у четырех возможных реализаций соответственно float, long, ulong, double. Явного соответствия нет, поэтому нужно искать самый короткий путь на схеме. Так как не существует неявного преобразования из типа int в тип ulong (на диаграмме нет пути), то остаются возможными три реализации. Но путь из int в long короче, чем остальные пути, поэтому будет выбрана long-реализация метода.
Следующий вызов демонстрирует еще одну возможную ситуацию. Для типа источника uint существуют две возможные реализации, и пути преобразований для них имеют одинаковую длину. В этом случае выбирается та реализация, для которой на диаграмме путь показан сплошной, а не пунктирной стрелкой, потому будет выбрана реализация с параметром long.
Рассмотрим еще ситуацию, приводящую к конфликту. Первый аргумент в соответствии
Явные преобразования
Как уже говорилось, явные преобразования могут быть опасными из-за потери точности. Поэтому они выполняются по указанию программиста, — на нем лежит вся ответственность за результаты.
Преобразования строкового типа
Важным классом преобразований являются преобразования в строковый тип и наоборот. Преобразования в строковый тип всегда определены, поскольку, напомню, все типы являются потомками базового класса Object, а, следовательно, обладают методом Tostring. Для встроенных типов определена подходящая реализация этого метода. В частности, для всех подтипов арифметического типа метод Tostring о возвращает в подходящей форме строку, задающую соответствующее значение арифметического типа. Заметьте, метод Tostring можно вызывать явно, но, если явный вызов не указан, то он будет вызываться неявно, всякий раз, когда по контексту требуется преобразование к строковому типу. Вот соответствующий пример:
/// <summary>
/// Демонстрация преобразования в строку данных различного типа.
/// </summary>
public void ToStringTest
{
s ="Владимир Петров
s1 =" Возраст: uх = 27;
s = s + s1 + uх. ToString ;
s1 =" Зарплата: "; dy = 2700.50;
s = s + s1 + dy;
WhoIsWho("s",s);
}
Рис. 4.3. Вывод на печать результатов теста ToStringTest
Здесь для переменной их метод был вызван явно, а для переменной dy он вызывается автоматически. Результат работы этой процедуры показан на рис. 4.3.
Преобразования из строкового типа в другие типы, например, в арифметический, должны выполняться явно. Но явных преобразований между арифметикой и строками не существуют. Необходимы другие механизмы, и они в C# имеются. Для этой цели можно использовать соответствующие методы класса Convert библиотеки FCL, встроенного в пространство имен System. Приведу соответствующий пример:
/// <summary>
/// Демонстрация преобразования строки в данные различного типа.
/// </summary>
public void FromStringTest
{
s ="Введите возраст";
Console.WriteLine (s);
s1 = Console.ReadLine;
ux = Convert.ToUInt32(s1);
WhoIsWho ("Возраст: ",ux);
s ="Введите зарплату";
Console.WriteLine(s);
s1 = Console.ReadLine;
dy = Convert.ToDouble (s1);
WhoIsWho("Зарплата: ",dy);
}
Элита элит
1. Элита элит
Фантастика:
боевая фантастика
рейтинг книги
Попаданка в академии драконов 2
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
рейтинг книги
Двойня для босса. Стерильные чувства
Любовные романы:
современные любовные романы
рейтинг книги
Кодекс Крови. Книга IV
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
рейтинг книги
Здравствуй, 1984-й
1. Девяностые
Фантастика:
альтернативная история
рейтинг книги
Офицер-разведки
2. Красноармеец
Фантастика:
боевая фантастика
попаданцы
рейтинг книги
Институт экстремальных проблем
Проза:
роман
рейтинг книги
