В .NET Framework существует ряд примеров, где существует несколько перегрузок для метода, некоторые из которых используют определенное количество параметров, за которым следует заключительный «catch» all ", где используется ключевое слово params
. Типичные примеры этого являются на String
классе т.д .:Преимущества использования как определенных аргументов, так и параметров перегрузки метода в C#
Я задавался вопрос, если есть конкретная причина, почему так многие из этих методов перегрузок? Сначала я подумал, что это может быть связано с производительностью; вопрос и ответы на этот вопрос SO - Cost of using params in C# - предложили бы так.
Однако я начал изучать исходный код .NET, используя веб-сайт Reference Source. Я заметил это в String class source code:
String.Concat()
действительно запускает другой код в зависимости от того, сколько фиксированных аргументов используется - это, на мой взгляд, определенно будет оптимизацией. String.Format()
однако только, кажется, обеспечивает обертки вокруг основного param
метода - см ниже для перефразировать кода:
public static String Format(String format, Object arg0)
{
return Format(format, new Object[] { arg0 });
}
public static String Format(String format, Object arg0, Object arg1)
{
return Format(format, new Object[] { arg0, arg1 });
}
public static String Format(String format, Object arg0, Object arg1, Object arg2)
{
return Format(format, new Object[] { arg0, arg1, arg2 });
}
public static String Format(String format, params Object[] args)
{
// Do work here...
}
Так есть преимущества в производительности или это может быть просто вопрос удобства, а может быть, и другое? В конкретном случае выше я не вижу никакой очевидной выгоды, и это, похоже, дублирует работу.
Сохраняет несколько байтов IL в каждом вызывающем абоненте: нет необходимости выделять и инициализировать массив. –
@MichaelLiu Но это * * выделяет и инициализирует массив здесь, он просто делает это внутри нового метода, а не снаружи. – Servy
@Servy: он сохраняет несколько байтов IL в каждом * вызывающем *. То есть, на каждом сайте вызова компилятор должен только генерировать инструкции для ввода аргументов. Если не было выделенных перегрузок, компилятор также должен был бы генерировать инструкции для выделения и инициализации массива. –