5

同じメソッド名を持つ2つのメソッドを作成し、値を渡して、条件付き属性といくつかの反条件付きを使用して返すことは可能ですか?

[Conditional("Debug")]
    private string StringGenerator()
    {
        Guid g = Guid.NewGuid();
        string guidString = Convert.ToBase64String(g.ToByteArray());
        guidString = guidString.Replace("=", "");
        guidString = guidString.Replace("+", "");
        return guidString;
    }


    [!Conditional("Debug")]// I know using '!' doesn't really work
    private string StringGenerator()
    {
        Guid g = Guid.NewGuid();
        string guidString = Convert.ToBase64String(g.ToByteArray());

        return guidString;
    } 

メソッドを呼び出すだけで、「デバッグ」が定義されているかどうかに基づいて、コンパイラはどのメソッドを選択しますか?

ありがとう

4

3 に答える 3

4

いいえ、これは不可能です。このConditional属性は、メソッドがコードで定義されているかどうかを制御するのではなく、メソッド呼び出しが呼び出し元のコードに含まれる条件を制御するだけです。

さらに、Conditional属性がメソッドに複数回適用される可能性があります。したがって、on / offここで行うべき単純な決定はありません。検討

[Conditional("DEBUG")]
[Conditional("TRACE")]
void Target() { ... }

ここでは、2つだけでなく、4つの組み合わせを検討する必要があります。

于 2013-03-04T17:01:25.997 に答える
3

#if DEBUG次のような構文を使用してみてください。

#if DEBUG
    private string StringGenerator()
    {
        Guid g = Guid.NewGuid();
        string guidString = Convert.ToBase64String(g.ToByteArray());
        guidString = guidString.Replace("=", "");
        guidString = guidString.Replace("+", "");
        return guidString;
    }

#else
    private string StringGenerator()
    {
        Guid g = Guid.NewGuid();
        string guidString = Convert.ToBase64String(g.ToByteArray());

        return guidString;
    }
#endif 

ただし、これを使用することにはいくつかの違いがあります。詳細については、この質問を参照してください。

于 2013-03-04T17:03:05.007 に答える
1

同じ名前と同じシグニチャを持つ複数の関数/メソッドを持つことはできません。ただし、シグニチャを変更することでメソッドをオーバーロードできます。例えば:

Private Function myMethod() As String
    Return "D"
End Function
Private Function myMethod(ByVal myString As String) As String
    Return "D"
End Function

2つの異なることを行う同じ正確な関数を作成しようとする代わりに、変数を渡して、値に応じて2つの異なることを行う方がよい場合があります。

Private Function myFunction(ByVal test As String) As String
     if(test.toUpper()= "QA") then
        'do one thing
     elseif(test.toUpper() = "LOCAL"
        'do another
     else
         'must be Prod
     end if
end Sub

通常、私が行うことは、使用している環境(Local、QA、Prod)を示すキーをweb.configファイルに入れ、その値に応じて、関数/メソッドに異なるパラメーターを渡します。次に、公開するときに、Web構成キーを変更します

于 2013-03-04T17:05:47.370 に答える