4

C#5.0では、オプションのパラメーターとメソッドのオーバーロードのどちらを使用しますか?

4

6 に答える 6

5

関数の内部実装がまったく異なる場合は、メソッドのオーバーロードを使用します。それ以外の場合は、オプションのパラメーターを使用します。

オプションのパラメータメソッドを使用すると、オーバーロードされたメソッドごとにテストメソッドを作成する代わりに、単一のテストメソッドを作成できます。

于 2012-11-09T15:25:50.667 に答える
1

メソッドを実行し、呼び出し元にすべてのパラメーターを指定させたくない場合は、オプションのパラメーターを使用する必要があります。

例えば。

private void method (int a, int b = 0){}// if B is optional

メソッド呼び出しでパラメーターのタイプを変更する場合は、メソッドのオーバーロードを使用する必要があります。

private void method (double a, int b = 0){}// type of parameter a is different - use overload

両方を使用できるので、どちらかまたは両方ではありません。それらは両方とも非常に異なる目的を持っています。

于 2012-11-09T15:27:40.847 に答える
1

すでに単純なメソッドにスイッチを追加するときは、オプションのパラメーターを使用することがわかりました。

public List<Stuff> GetItems (Guid stuffID, bool includeDeleted = false)
{
   //implementation
}

利点は、GetItemsメソッドがアプリケーションの他の領域ですでに広く使用されている可能性があり、使用するたびにパラメーターを追加する必要がないことです。

多数のパラメーターを持つメソッドがあり、どのパラメーターがオプションでどれが面倒ではないかを管理する場合、オプションのパラメーターが問題になります。その場合、提供するパラメーターの命名を開始する必要があります。私はそれを少し混乱させます

上記の例よりも複雑なものは、実際にはオーバーロードを使用する必要があります。複数のオプションパラメータを使用する1つの例も考えられません。

于 2012-11-09T15:35:44.290 に答える
0

指摘したように、オプションのパラメータはリストの最後になければなりません。しかし、ほとんどの場合、それは実際には問題ではありません。

.NETクラスの多くがオーバーロードを使用する唯一の理由は、それらのクラスが作成されたときにオプションのパラメーターが使用できなかったためであるという兆候があります。そのため、通常、オプションのパラメーターは、複数のバージョンのメソッドよりも作成が少し簡単です。

しかし、繰り返しになりますが、私はここで正しい方法も間違った方法も実際には見ていません。

于 2012-11-09T15:27:42.520 に答える
0

メソッドのオーバーロードは、いくつかの状況でオプションのパラメーターに置き換えることができますが、完全に同じではありません。たとえば、メソッドのオーバーロードを使用する必要がある場合もあります。

void Foo()
{
    Foo(DateTime.Now);
}

void Foo(DateTime dt)
{
    //do something
}

//you can't use optional parameters here because DateTime.Now is not a constant
void Foo(DateTime dt = DateTime.Now)  //compile error
{
    //do something
}

一部のシナリオでは、どちらも問題ありません。コードが短く明確になるため、オプションのパラメーターを使用することをお勧めします。

于 2012-11-09T15:28:30.720 に答える
0

オーバーロードの代わりにオプションのパラメーターを使用することは問題ではないと思いますが、「一定の制約」のためにオプションのパラメーターを使用する際に問題が発生したと言わざるを得ません。タイプのパラメータがありましたDateTime。次のシグネチャを持つ関数を使用したかったのです。

void AddItem(string itemCode, Datetime defaultUpdateTime = DateTime.Now

しかし、コンパイル時に `を取得したため、それを行うことができませんでした

「オプションのパラメータはコンパイル時定数でなければなりません

したがって、オーバーロードを使用すると、2つの異なる署名を使用し、適切にパラメーターを初期化することで、このような問題を回避できることを考慮する必要があります。

于 2012-11-09T15:42:06.300 に答える