私はReflectorを使用してString.Formatの実装を調べていましたが、1、2、3個の引数をとるString.Formatのオーバーロードは、オブジェクト配列をとるメソッドの最適化されたバージョンであるという印象を常に受けていました。しかし、私が見つけたのは、内部的にオブジェクト配列を作成してから、オブジェクト配列を受け取るメソッドを呼び出すことでした。
1引数
public static string Format(string format, object arg0)
{
if (format == null)
{
throw new ArgumentNullException("format");
}
return Format(null, format, new object[] { arg0 });
}
2つの引数
public static string Format(string format, object arg0, object arg1)
{
if (format == null)
{
throw new ArgumentNullException("format");
}
return Format(null, format, new object[] { arg0, arg1 });
}
3つの引数
public static string Format(string format, object arg0, object arg1, object arg2)
{
if (format == null)
{
throw new ArgumentNullException("format");
}
return Format(null, format, new object[] { arg0, arg1, arg2 });
}
オブジェクト配列
public static string Format(string format, params object[] args)
{
if ((format == null) || (args == null))
{
throw new ArgumentNullException((format == null) ? "format" : "args");
}
return Format(null, format, args);
}
内部的には、それらはすべて同じコードを使用することになります。したがって、1、2、および3引数バージョンを使用することは、オブジェクト配列バージョンよりも高速ではありません。
だから私の質問は-なぜそれらが存在するのですか?
値のコンマ区切りリストでオブジェクト配列バージョンを使用する場合、コンパイラは、params / ParamArrayキーワードが基本的に1、2、および3バージョンと同じであるため、引数をオブジェクト配列に自動的に変換するため、冗長に見えます。BCL設計者がこれらのオーバーロードを追加したのはなぜですか?