2013-03-04 5 views
5

は、あなただけのメソッドを呼び出すに基づくことができるように、たとえばsimaliarデバッガと実行時メソッドを作成するために条件付き属性を使用できますか?

[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; 
    } 

のために2と同じメソッド名を持っている方法、条件属性を使用して値を返すに渡され、いくつかの抗条件を作成することが可能です"デバッグ"が定義されているかどうかコンパイラはどの方法を選択するのですか?

ありがとうございます。

+0

実在の例[HtmlAgilityPack/IOLibrary.cs](https://htmlagilitypack.codeplex.com/SourceControl/latest#Trunk/HtmlAgilityPack/IOLibrary.cs)興味があります。 – Bakudan

答えて

3

はあなたがそうのような#if DEBUG構文を使用して試すことができますがありますを考えてみましょう。詳細はthis questionを参照してください。

+0

コード内の 'debug'は大文字にする必要があります:' #if DEBUG' –

+0

@chuex - 右!それを忘れてしまった。ありがとう。 :) –

+0

ありがとう私は完全にそのことを確認することを忘れていた –

3

いいえ、これはできません。 Conditional属性は、メソッドがコードで定義されているかどうかを制御せず、メソッド呼び出しが呼び出しコードに含まれる条件を制御するだけです。

さらに、Conditional属性をメソッドに複数回適用することは可能です。したがってここでは単にon/offの決定をすることはありません。しかし、これを使用したといくつかの違いがある

#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 

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

検討するここ4つの組み合わせだけではなく、2

1

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

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

が代わりに二つの異なることを行いまったく同じ機能を、作成しようと、変数で渡す方が良いと、値の応じて、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 

私は(ローカル、QA、製品版)を使用して、その値に応じていますどのような環境の意味私のweb.configファイル内のキーを持っている、私はに異なるパラメータを渡すと思います私の機能/方法。次に、私が公開するとき、私はウェブ設定キーを変更します

関連する問題