Перегрузка методов

Перегрузка в С# — прием времени компиляции, при котором в точке вызова компилятор выбирает метод из набора одноименных методов с разной сигнатурой. Для выбора наиболее подходящего метода компилятор использует список аргументов.

Типы аргументов, а также модификаторы параметров ref, out и params играют роль в перегрузке методов, поскольку все они составляют часть сигнатуры метода. Методы без параметров-массивов переменной длины получают преимущества перед методами, имеющими такие параметры.

Подобно С++, тип возврата метода не является частью сигнатуры (за исключением одного редкого случая операций преобразования). Поэтому внутри класса нельзя иметь перегруженные методы, отличающиеся только типом возврата. И, наконец, если компилятор доходит до точки, где обнаруживается неоднозначность в выборе версии перегруженного метода, компиляция останавливается с выдачей сообщения об ошибке.

В целом между перегрузкой методов в С# и перегрузкой методов в С++ разницы нет. Обычно она не может послужить причиной возникновения исключений времени выполнения, поскольку весь алгоритм выбора применяется во время компиляции. Когда компилятор не может найти точно подходящий метод на основе переданных параметров, он начинает подбор наиболее подходящего соответствия на основе возможности неявного преобразования экземпляров в списке параметров.

Поэтому если метод с одним параметром принимает объект типа А, а ему передается объект типа В, унаследованный от А, то в отсутствии версии этого метода, которая бы принимала тип В, компилятор неявно преобразует переданный экземпляр к ссылке типа А, чтобы удовлетворить такой вызов. В зависимости от ситуации и величины набора перегруженных методов процесс выбора может оказаться довольно сложным.

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

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

Это не значит, что неявные преобразования — плохая вещь при разрешении перегрузки, но лучше использовать их благоразумно и сдержанно, чтобы минимизировать неприятные сюрпризы в будущем. Начиная с версии С# 4.0, разрешение перегрузки может генерировать исключения во время выполнения при использовании нового типа dynamic.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100