Чому методи, що приймають необмежену кількість параметрів, часто визначають перевантаження з меншою кількістю параметрів?


36

Наприклад, System.IO.Path.Combineметод у .NET має такі перевантаження:

Combine(params String[])
Combine(String, String)
Combine(String, String, String)
Combine(String, String, String, String)

У чому сенс останніх трьох?

Перший охоплював би їх усіх, так як якщо ви уважно придивитесь, він використовує paramsключове слово. Аргумент зворотної сумісності охоплював би лише Combine(String, String)варіант, оскільки він був єдиною версією до .NET 4.

Відповіді:


56

Основна причина - продуктивність. Синтаксичний цукор "необмежених аргументів" - це фактично масив Strings. Якщо ви передаєте лише один рядок, навіщо створювати масив лише з однієї рядка? Особливо, якщо ~ 90% викликів цього методу будуть мати 3 або менше аргументів, немає необхідності в більш важкому об'єкті маси маси. Це трохи легше в пам’яті і займає трохи менше часу на обробку, оскільки для визначення методу вам не потрібна петля. Якщо у вас є три рядки, ви просто кодуєте три струни.


Ще слід зазначити, що проходження Combineз нульовим або одним сегментом шляху навіть не має сенсу, але paramsверсія дозволяє це зробити.
Матвій

4
Причиною кількості перевантажень, які приймають різні числа аргументів, є не читабельність. Це для продуктивності через накладні витрати, що виникають при створенні масиву рядків, а потім їх обробці. Причиною прийняття params string[]є читабельність.
Грег Бургхардт

2
Дійсність справді є причиною, і я вважаю, що це спеціально для того, коли очікується, що функція буде викликана з внутрішніх циклів . Як зазначено в примітці Бреда Абрамса на с.27 мови програмування C #, Третє видання : "[T] he C # модель створює додаткове виділення об'єктів (містить масив) неявно під час кожного виклику. Це рідко є проблемою, але у внутрішній - сценарії типу loop, де це може стати неефективним, ми пропонуємо забезпечити перевантаження для основних випадків і використовувати paramsперевантаження лише для кращих випадків. Прикладом може бути StringBuilder.AppendFormat()сімейство перевантажень. "
Елія Каган

3
@LowFlyingPelican Mono і .NET Framework - не однакові. Якщо ви подивитеся на .NET Framework версію , це насправді зовсім інше рішення.
Олексій

3
@LowFlyingPelican: Причиною .NET Framework є продуктивність. Причиною Моно для впровадження цього методу стала сумісність API з .NET. Причиною Моно таким способом було застосовано простоту в реалізації (за рахунок них у них значно менше ресурсів, ніж у Microsoft).
Джомінал

4

Синтаксичний цукор.

При маніпулюванні шляхами файлів надзвичайно часто є невелика кількість фіксованих значень. У цих випадках зручніше використовувати їх безпосередньо, а не пакувати їх у масив.


3
З парамами ви вже це засуджуєте. msdn.microsoft.com/en-us/library/w5zay9db.aspx Немає потреби в масиві.
Томас Джунк

3
У C # у вас є точка, @Thomas. Однак .NET також підтримує інші мови без params.
Карл Білефельдт

@ThomasJunk Це посилання для мене мертве, на жаль, але я впевнений, ти маєш рацію, оскільки мій C # посередній. Я щойно бачив багато бібліотек з багатьма мовами, які роблять це лише для того, щоб дозволити більш чистий код.
Gort the Robot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.