無制限の量のパラメーターを取るメソッドが、より少ないパラメーターでオーバーロードを定義することが多いのはなぜですか?


36

たとえばSystem.IO.Path.Combine、.NET のメソッドには次のオーバーロードがあります。

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

最後の3つのポイントは何ですか?

最初のものはそれらをすべてカバーしますが、よく見るとparamsキーワードを使用しています。Combine(String, String).NET 4までの唯一のバージョンであったため、下位互換性の議論はバリアントのみを対象としています。

回答:


56

主な理由はパフォーマンスのためです。「無制限の引数」構文糖は、実際には文字列の配列です。1つの文字列のみを渡す場合、なぜ1つの文字列のみで配列を作成するのですか 特に、このメソッドの呼び出しの〜90%が3つ以下の引数である場合、より重い重み配列オブジェクトは必要ありません。メソッドを定義するためにループを必要としないため、メモリが少し軽くなり、処理時間が少し短くなります。3つの文字列がある場合、3つの文字列をコーディングするだけです。


もう1つ注意すべき点は、Combine0または1つのパスセグメントで渡すことは意味をなさないparamsことですが、バージョンではこれを行うことができます。
マシュー

4
異なる数の引数を受け入れるオーバーロードの数の理由は、読みやすさのためではありません。文字列の配列を生成して処理することで発生するオーバーヘッドのため、パフォーマンスのためです。受け入れる理由params string[]は読みやすさのためです。
グレッグブルクハート

2
確かにパフォーマンスが理由であり、関数がループ内から呼び出されることが期待される場合に特に適していると思いますThe C#Programming Language、 p.27のBrad Abramsの注釈のように、第3版次のように述べています。 -非効率になるループ型のシナリオでは、主流の場合にオーバーロードを提供しparams、エッジの場合にのみオーバーロードを使用することをお勧めします。一例はStringBuilder.AppendFormat()オーバーロードのファミリーです。
エリアケイガン

3
@LowFlyingPelican Monoと.NET Frameworkは同じではありません。.NET Frameworkのバージョンを見ると、実際にはまったく別のソリューションです。
アレックス

3
@LowFlyingPelican:.NETフレームワークの理由パフォーマンスです。Monoがそのメソッドを実装した理由は、.NETとのAPI互換性でした。この方法でそのメソッドを実装するMonoの理由は、実装の単純さです(Microsoftよりもリソースがかなり少ないため)。
ジョミナル

4

構文糖。

ファイルパスを操作するとき、少数の固定値を持つことは非常に一般的です。これらの場合、配列にパッケージ化するよりも、直接使用する方が便利です。


3
paramsを使用すると、すでにそれをシュガーしています。msdn.microsoft.com/en-us/library/w5zay9db.aspxアレイは不要です。
トーマスジャンク

3
C#には、@ Thomasというポイントがあります。ただし、.NETはparams
カールビーレフェルト

@ThomasJunk残念ながら、そのリンクは私にとっては死んでいますが、私のC#は平凡なので正しいと確信しています。よりクリーンなコードを可能にするためにそれを行う多くの言語を持つ多くのライブラリを見てきました。
ロボット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.