C#5.0では、オプションのパラメーターとメソッドのオーバーロードのどちらを使用しますか?
6 に答える
関数の内部実装がまったく異なる場合は、メソッドのオーバーロードを使用します。それ以外の場合は、オプションのパラメーターを使用します。
オプションのパラメータメソッドを使用すると、オーバーロードされたメソッドごとにテストメソッドを作成する代わりに、単一のテストメソッドを作成できます。
メソッドを実行し、呼び出し元にすべてのパラメーターを指定させたくない場合は、オプションのパラメーターを使用する必要があります。
例えば。
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
両方を使用できるので、どちらかまたは両方ではありません。それらは両方とも非常に異なる目的を持っています。
すでに単純なメソッドにスイッチを追加するときは、オプションのパラメーターを使用することがわかりました。
public List<Stuff> GetItems (Guid stuffID, bool includeDeleted = false)
{
//implementation
}
利点は、GetItemsメソッドがアプリケーションの他の領域ですでに広く使用されている可能性があり、使用するたびにパラメーターを追加する必要がないことです。
多数のパラメーターを持つメソッドがあり、どのパラメーターがオプションでどれが面倒ではないかを管理する場合、オプションのパラメーターが問題になります。その場合、提供するパラメーターの命名を開始する必要があります。私はそれを少し混乱させます
上記の例よりも複雑なものは、実際にはオーバーロードを使用する必要があります。複数のオプションパラメータを使用する1つの例も考えられません。
指摘したように、オプションのパラメータはリストの最後になければなりません。しかし、ほとんどの場合、それは実際には問題ではありません。
.NETクラスの多くがオーバーロードを使用する唯一の理由は、それらのクラスが作成されたときにオプションのパラメーターが使用できなかったためであるという兆候があります。そのため、通常、オプションのパラメーターは、複数のバージョンのメソッドよりも作成が少し簡単です。
しかし、繰り返しになりますが、私はここで正しい方法も間違った方法も実際には見ていません。
メソッドのオーバーロードは、いくつかの状況でオプションのパラメーターに置き換えることができますが、完全に同じではありません。たとえば、メソッドのオーバーロードを使用する必要がある場合もあります。
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
}
一部のシナリオでは、どちらも問題ありません。コードが短く明確になるため、オプションのパラメーターを使用することをお勧めします。
オーバーロードの代わりにオプションのパラメーターを使用することは問題ではないと思いますが、「一定の制約」のためにオプションのパラメーターを使用する際に問題が発生したと言わざるを得ません。タイプのパラメータがありましたDateTime
。次のシグネチャを持つ関数を使用したかったのです。
void AddItem(string itemCode, Datetime defaultUpdateTime = DateTime.Now
しかし、コンパイル時に `を取得したため、それを行うことができませんでした
「オプションのパラメータはコンパイル時定数でなければなりません
したがって、オーバーロードを使用すると、2つの異なる署名を使用し、適切にパラメーターを初期化することで、このような問題を回避できることを考慮する必要があります。