C # использует одну отправку, которая включает перегруженные методы. Когда у вас есть код
stringBuilder.Append(parameter);
диспетчер просматривает все методы, определенные в классе stringBuilder, и находит правильный.
Для примера с несколькими рассылками, давайте посмотрим на Пролог (который является первым, о котором я могу подумать). Вы можете определить функцию в прологе так:
func(Arg1, Arg2) :- ....body....
Это не определено ни в каком классе, но в глобальной области видимости. Затем вы можете вызвать func(Arg1, Arg2)
для любых двух аргументов, и эта функция будет вызвана. Если вы хотите что-то вроде перегрузки, вы должны проверить типы аргументов внутри функции и определить это несколько раз:
func(Arg1, Arg2) :- is_number(Arg1), is_string(Arg2), ....body....
func(Arg1, Arg2) :- is_string(Arg1), is_list(Arg2), ....body....
func(Arg1, Arg2) :- is_number(Arg1), is_list(Arg2), ....body....
Затем будут проверены любые два типа аргументов, которые вы отправите, - это часть множественной отправки.
Короче говоря, одиночная отправка просматривает только методы, определенные в первом аргументе (в нашем первом примере, stringBuilder), а затем разрешает правильную перегрузку для вызова с использованием других аргументов. Множественная диспетчеризация имеет методы / функции, определенные в глобальной области, и обрабатывает все аргументы одинаково во время разрешения перегрузки.
Надеюсь, я дал понять, что это довольно сложный вопрос.
Обновление: я забыл упомянуть, многократная отправка происходит во время выполнения, тогда как одиночная отправка происходит во время компиляции.
Обновление № 2: По-видимому, это было не так.