1. ホーム
  2. c#

[解決済み] C# 4.0におけるメソッドのオーバーロードとオプションのパラメータ [重複].

2022-08-23 20:30:40

質問

一見すると、オプショナルパラメータの方が良さそうですが(コードの削減、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つ以上のメソッドを定義することをかなり冗長にすることに注意してください。これは、名前付きパラメータと組み合わせてオプションのパラメータを使用するための良いユースケースであることがわかりました。