1. ホーム
  2. c#

[解決済み] Console.WriteLine()と多くの引数オーバーロードの必要性?

2023-05-14 02:41:28

疑問点

ドキュメントを見ていて、以下のことに気づきました。 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);

冗長な感じがします。最初のオーバーロードの上に他の4つのオーバーロードが必要なのでしょうか? 最初のメソッドは、他のメソッドができることすべてを行うことができます。 最大 4 つの引数 (最後の 1 つ) を処理する追加のオーバーロードを提供することによって取り組もうとしたパフォーマンスの懸念があったのでしょうか。 最大 4 つの引数の配列を通過するオーバーヘッドは、これらのオーバーロードの必要性を提供するのに十分大きいのでしょうか?

どのように解決するのですか?

一般に、最初のオーバーロードが他のオーバーロードに十分対応できることは正しいです。 しかし、これは厳密には正しくありません。 params キーワードはメソッドグループ結合のような間接的なケースには使用できないからです。 たとえば

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

params のオーバーロードはこのケースを満たさず、この特定のオーバーロードが存在するときのみ機能します。

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

これはかなり難解なケースですが。 より重要な理由は以下の通りです。

  1. すべての CLI 言語で params キーワードをサポートする必要はありません。 オーバーロードを持つことで、単純な WriteLine` 呼び出しに対して手動で配列を作成する必要がなくなり、それらの言語に対する負担が軽減されます。
  2. パフォーマンス。 の呼び出しは params オーバーロードを呼び出すと、たとえそれがコンパイラによって暗黙のうちに行われたとしても、呼び出し元は配列を割り当てることを強制されます。 .Netではアロケーションは安価ですが、無料ではありません。 このような小さなことはすぐに積み重なります。 Console.WriteLine . 他のオーバーロードを使用することで、このアロケーションを回避する一般的なケースを可能にします。