Console.WriteLine() и необходимость в стольких перегрузках аргументов?

Я просматривал документацию и заметил, что метод Console.WriteLine() имел несколько перегрузок. В частности, мое любопытство и частичная путаница относятся к ним:

public static void WriteLine(string format, params object[] arg);
public static void WriteLine(string format, object arg0);
public static void WriteLine(string format, object arg0, object arg1);
public static void WriteLine(string format, object arg0, object arg1, object arg2);
public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3);

Кажется излишним. В чем нуждаются остальные четыре перегрузки над первым? Первый метод способен делать все, что могут сделать другие методы. Есть ли проблема с производительностью, которую они пытались решить, предоставляя дополнительные перегрузки, которые обрабатывают до четырех аргументов (последний)? Являются ли накладные расходы доступным массивом до четырех аргументов, достаточных для обеспечения этих перегрузок?

Ответ 1

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

delegate void E(string format, object o1);
E e = Console.WriteLine;

Перегрузка params не будет удовлетворять этому случаю, она будет работать только тогда, когда присутствует эта конкретная перегрузка.

public static void WriteLine(string format, object arg0);

Это довольно эзотерический случай. Более важными причинами являются следующие

  • Для поддержки ключевого слова params требуется не каждый язык CLI. Наличие перегрузок снижает нагрузку на эти языки, устраняя необходимость вручную создавать массив для простого вызова WriteLine`
  • Производительность. Вызов перегрузки params заставляет вызывающего абонента выделять массив, даже если он неявно компилятором. Распределение дешево в .Net, но не бесплатно. Небольшие вещи, подобные этому, складываются быстро, особенно на обычно называемых методах вроде Console.WriteLine. Наличие других перегрузок позволяет обычным случаям избежать этого распределения.

Ответ 2

Перегрузки предназначены для удобства программ С++/CLI, где ключевое слово params не существует.

Ответ 3

Я думаю, что вы, ребята, забываете, что параметры были введены в С# 2.0. Поэтому перегрузки также существуют из .NET 1.1, когда ключевое слово params не выполнялось.

Ответ 4

Я думаю, что заданный вопрос уже содержит хорошие и пояснительные ответы JaredPar и jaket, но один пункт что я думаю, может быть уместным,

Я считаю, что простота использования и свобода для пользователей использовать любую из вышеперечисленных функций в соответствии с этим требованием, там есть гораздо удобнее, а затем накладывать их на создание массива, когда они действительно этого не требуют.

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

Ответ 5

Это не относится к проблеме производительности как таковой. Однако увеличение удобства использования является веской причиной этого.

Код ниже, даст вам небольшую информацию.

public class TipCalculator {
    private const double tipRate = 0.18;
    public static int Main(string[] args) {
        double billTotal;
        if (args.Length == 0) {
            Console.WriteLine("usage: TIPCALC total");
            return 1;
        }
        else {
            try {
                billTotal = Double.Parse(args[0]);
            }
            catch(FormatException) {
                Console.WriteLine("usage: TIPCALC total");
                return 1;
            }
            double tip = billTotal * tipRate;
            Console.WriteLine();
            Console.WriteLine("Bill total:\t{0,8:c}", billTotal);
            Console.WriteLine("Tip total/rate:\t{0,8:c} ({1:p1})", tip, tipRate);
            Console.WriteLine(("").PadRight(24, '-'));
            Console.WriteLine("Grand total:\t{0,8:c}", billTotal + tip);
            return 0;
        }
    }
}

Пожалуйста, обратитесь к ссылке: http://msdn.microsoft.com/en-us/library/aa324774(v=vs.71).aspx для получения дополнительной информации.