3

I want to hide some member vars in my C# class.
I can do this via the DebuggerBrowsable attribute:

using System.Diagnostics;

[DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
int myvar;

However, I only want this attribute to be applied for Release builds - I want to hide the var from my assembly's Release-build consumers but I want the var visible in Debug builds for inspection during dev, etc.

I could, but would prefer not to, wrap each attribute in an #if block:

#if !DEBUG
        [DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
#endif

That would do the trick, but creates some pretty messy-looking code.

If I were in C++/CLI - and had macros - I could do this:

#ifdef _DEBUG
#define HIDDEN_MEMBER
#else
#define HIDDEN_MEMBER   [System::Diagnostics::DebuggerBrowsableAttribute(System::Diagnostics::DebuggerBrowsableState::Never)]
#endif

and then

HIDDEN_MEMBER
int myvar;

But no macros in C# :(

Any bright ideas as to how to achieve the macro-like syntax in C#?

4

4 に答える 4

2

試す

const bool debugging = true;

その後

[DebuggerBrowsableAttribute(debugging ? DebuggerBrowsableState.Collapsed
                                      : DebuggerBrowsableState.Never)]
于 2012-08-25T19:30:31.030 に答える
2

ConditionalAttribute クラスを参照してください。[Conditional]属性を属性に適用できます[DebuggerBrowsable]

于 2012-08-25T19:07:54.230 に答える
1

タイプエイリアスを使用した別の提案:

#if DEBUG
using HiddenMember = global::DummyAttribute.HiddenMember;
#else
using HiddenMember = global::System.Diagnostics.DebuggerBrowsableAttribute;
#endif

namespace DummyAttribute
{
    class HiddenMember : Attribute
    { public HiddenMember(DebuggerBrowsableState dummy) { } }
}

使用法:

public class YourClass
{
    [HiddenMember(DebuggerBrowsableState.Never)]
    int YourMember = 0;
}

DebuggerBrowsableState.Never引数を定数の後ろに自由に隠してください。

于 2012-08-26T14:47:35.170 に答える
0

ここに私が思いついたものがあります。

In the base class:
#if DEBUG
   [DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
   internal const System.Diagnostics.DebuggerBrowsableState BROWSABLE_ATTRIB = System.Diagnostics.DebuggerBrowsableState.Collapsed;
#else
   [DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
   internal const System.Diagnostics.DebuggerBrowsableState BROWSABLE_ATTRIB = System.Diagnostics.DebuggerBrowsableState.Never;
#endif

私のすべてのオブジェクトが共通のベースを持っているため、これは私にとってはうまくいきます。
私は BROWSABLE_ATTRIB を隠していることに注意してください... その const を公開したくありません。

次に、任意の派生クラスで:

[DebuggerBrowsable(BROWSABLE_ATTRIB)]
int myvar;

@Olivierの回答よりもこれを好みますが、投稿してくれたことに感謝します。
各属性の 3 項は#if #else #endif混乱よりも優れていますが、それでも私が好むよりも冗長です。

私はConditionalAttributeも知りませんでした。@Tony に感謝します。この特定の状況を解決できないかもしれませんが、他の人にとって非常に役立つことがわかり、私のトリックのバッグに追加できることに感謝しています.

于 2012-08-25T21:29:06.620 に答える