[解決済み] C# 4.0におけるメソッドのオーバーロードとオプションのパラメータ [重複].
質問
一見すると、オプショナルパラメータの方が良さそうですが(コードの削減、XMLドキュメントの削減など)、なぜMSDNライブラリクラスの多くはオプショナルパラメータの代わりにオーバーロードを使用するのでしょうか?
オプショナルパラメータ(またはオーバーローディング)を使用する際に注意しなければならない特別なことはありますか?
どのように解決するのですか?
C# 4.0 の「名前付きパラメータ」と組み合わせた「オプションのパラメータ」の良い使用例として、パラメータの数に基づいてメソッドをオーバーロードする、メソッドのオーバーロードのエレガントな代替手段を提示していることが挙げられます。
例えば、あるメソッド
foo
をこのように呼び出すとします。
foo()
,
foo(1)
,
foo(1,2)
,
foo(1,2, "hello")
. メソッドのオーバーロードを利用すると、このような解決策を実装することができます。
///Base foo method
public void DoFoo(int a, long b, string c)
{
//Do something
}
/// Foo with 2 params only
public void DoFoo(int a, long b)
{
/// ....
DoFoo(a, b, "Hello");
}
public void DoFoo(int a)
{
///....
DoFoo(a, 23, "Hello");
}
.....
C#4.0でオプションのパラメータを使用すると、次のようなユースケースを実装することになります。
public void DoFoo(int a = 10, long b = 23, string c = "Hello")
そして、このメソッドを次のように使うことができます - 名前付きパラメータの使用に注意してください - 。
DoFoo(c:"Hello There, John Doe")
この呼び出しは、パラメータ
a
の値を10とし、パラメータ
b
を 23 とします。
この呼び出しの別のバリエーション - メソッドの署名に表示されているような順序でパラメータ値を設定する必要がないことに注意してください。
DoFoo(c:"hello again", a:100)
名前付きパラメータを使用するもう一つの利点は、読みやすさを大幅に向上させ、その結果、オプションのパラメータメソッドのコードの保守性を向上させることです。
1つのメソッドが、メソッドのオーバーローディングで3つ以上のメソッドを定義することをかなり冗長にすることに注意してください。これは、名前付きパラメータと組み合わせてオプションのパラメータを使用するための良いユースケースであることがわかりました。
関連
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] Javaオプションパラメータ
-
[解決済み] C#でメソッドをパラメータとして渡す
-
[解決済み] C#でオプションのパラメータを使用するにはどうすればよいですか?
-
[解決済み] C#でURLのクエリ文字列を作成するには?
-
[解決済み] C#4 インターフェースで定義されたオプションパラメータは、なぜ実装クラスで強制されないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み] 関数を終了するには?