Основы языка C# 2005. Евсеева О.Н - 92 стр.

UptoLike

Составители: 

96
стороне, по двум сторонам и углу между ними и при многих других наборах
аргументов. Считается удобным во всех случаях иметь для метода одно имя,
например Square, и всегда, когда нужно вычислить площадь, не задумываясь,
вызывать метод Square, передавая ему известные в данный момент аргументы.
Перегрузка характерна и для знаков операций. В зависимости от типов
аргументов, один и тот же знак может выполнять фактически разные операции.
Классическим примером является знак операции сложения «+», который играет
роль операции сложения не только для арифметических данных разных типов,
но и выполняет конкатенацию строк.
Перегрузка требует уточнения семантики вызова метода. Когда
встречается вызов неперегруженного метода, то имя метода в вызове
однозначно определяет, тело какого метода должно выполняться в точке
вызова. Когда же метод перегружен, то знания имени недостаточнооно не
уникально. Уникальной характеристикой перегруженных методов является их
сигнатура. Перегруженные методы, имея одинаковое имя, должны отличаться
либо числом аргументов, либо их типами, либо ключевыми словами (отметим:
с точки зрения сигнатуры, ключевые слова ref и out не отличаются).
Уникальность сигнатуры позволяет вызвать требуемый перегруженный метод.
Выше (стр. 86) уже были приведены четыре перегруженных метода с
именем A, различающиеся по сигнатуре. Эти методы отличаются типами
аргументов и ключевым словом params. Когда вызывается метод A с двумя
аргументами, то, в зависимости от типа, будет вызываться реализация без
ключевого слова params. Когда же число аргументов больше двух, то работает
реализация, позволяющая справиться с заранее не фиксированным числом
аргументов. При поиске подходящего перегруженного метода частные случаи
получают предпочтение в сравнении с общим случаем.
Насколько полезна перегрузка методов? Здесь нет экономии кода,
поскольку каждую реализацию нужно задавать явно; нет выигрыша по времени
напротив, требуются определенные затраты на поиск подходящей
реализации, который может приводить к конфликтам, обнаруживаемым на
этапе компиляции. В нашем примере вполне разумно иметь четыре метода с
разными именами и осознанно вызывать метод, применимый к данным
аргументам. Существуют ситуации, где перегрузка полезна, недаром она
широко используется при построении библиотеки FCL. Например, класс
Convert, у которого 16 методов с разными именами, зависящими от целевого
типа преобразования. Каждый из этих 16 методов перегружен, и в свою
очередь, имеет 16 реализаций в зависимости от типа источника.
Приведём исходный код метода, тестирующего работу перегруженных
функций:
public void TestLoadMethods()
{
long u = 0;
double v = 0;