2016-11-12 7 views
4
//method with an optional parameter 
public void DoSomething(int a, int b = 42); 

//caller 
DoSomething(a, b: default); 

これはC#で行うことができますか?デフォルトのパラメータ値を渡す(何でも)

「パラメータを設定したくない場合は、パラメータを設定せずにメソッドを呼び出す」と言うこともできます。しかし、私は私のコードでは、このような醜いのIFを得る:

//kinda ugly :(
if(parameterIsSet) 
    DoSomething(a, myValue); 
else 
    DoSomething(a); 

私の代わりにこれを行うことができた場合:

DoSomething(a, b: parameterIsSet ? myValue : 42); 

しかしI:

DoSomething(a, b: parameterIsSet ? myValue : default); 

私はもちろん、これを行うことができます2つの場所で "42"をハードコードしたくない

+1

あなたはDoSomethingの定義にアクセスしており、それを変更する権利がありますか? – CodeNotFound

+1

あなたのロジックは 'parameterIsSet'と' myValue'をリンクしているようです。 DoSomethingの内部でこのロジックを扱うのはなぜですか? 'myValue'が' null 'であっても 'DoSomething(a、myValue)'を返します。 – rbm

+0

@rbm多分彼はDoSomethingコードにアクセスできません。 – CodeNotFound

答えて

4

このような場合は、 ouldは通常コメントに付き添いとしてnullを使用します。したがって、コードは次のようになります。あなたはまだparameterIsSetを持っている場合は

int? myB = null; 
if (/* some condition */) 
{ 
    myB = 29; 
} 

DoSomething(a, myB); 

を:そのような場合には

public void DoSomething(int a, int? bOverwrite = null) 
{ 
    int b = bOverwrite ?? 42; 
    // remaining code as before... 
} 

、あなたは一般的にparameterIsSet変数を削除し、nullを指定して変数を初期化し、必要に応じて値を設定します、あなたはこのように関数を呼び出すことができます:

DoSomething(a, parameterIsSet ? b : default(int?)); 

他の代替:

あなたは多くのそのようなパラメータを持っている場合、パラメータのためのクラスを作成し、コンストラクタでそのデフォルト値を設定する方が簡単かもしれません:

class DoSomethingParameters 
{ 
    public DoSomethingParameters() { A = 12; B = 42; } 
    public int A { get; set; } 
    public int B { get; set; } 
} 

var parameters = new DoSomethingParameters(); 
parameters.A = /* something */; 

if (/* some condition */ { 
    parameters.B = 29; 
} 

DoSomething(parameters); 

を、いくつかのケースならば、醜いIFSは、多くのように最善の解決策かもしれませんとにかく同じ条件を使用してbを初期化するか、すべてを追跡するために変数を増やす必要があり、最終コードは醜いコードよりも醜いかもしれません。

if (/* some condition */) 
{ 
    int b = some_complet_expression; 
    DoSomething(a, b); 

    // Some other stuff here.... 
} 
else 
{ 
    DoSomething(a); 

    // Different stuff here... 
} 

特に、呼び出し後の条件に依存する他のコードを使用する場合は、基本的な解決策である可能性があります。それぞれのケースは固有です。経験では、状況に最適なコードを書く方法を学びます。

+0

を使用してください。ええ、私はあなたの1番目のコードスニペットのように、 'null'が行く方法だと思います。ありがとう – jazzcat

関連する問題