Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.
Atributy zobrazení ladicího programu umožňují vývojáři typu, který určuje a nejlépe rozumí chování modulu runtime daného typu, aby také určil, jaký typ bude vypadat, když se zobrazí v ladicím programu. Kromě toho lze ladicí atributy zobrazení, které poskytují vlastnost Target, použít uživateli na úrovni sestavení bez znalosti zdrojového kódu. Atribut DebuggerDisplayAttribute řídí, jak se typ nebo člen zobrazí v oknech proměnných ladicího programu. Atribut DebuggerBrowsableAttribute určuje, zda a jak se pole nebo vlastnost zobrazí v oknech proměnných ladicího programu. Atribut DebuggerTypeProxyAttribute určuje náhradní typ nebo proxy pro typ a mění způsob zobrazení typu v oknech ladicího programu. Když zobrazíte proměnnou, která má proxy nebo náhradní typ, proxy v okně zobrazení ladicího nástroje nahrazuje původní typ. V okně proměnné ladicího programu se zobrazí pouze veřejné členy typu proxy serveru. Soukromé členy se nezobrazují.
Použití atributu DebuggerDisplay
Konstruktor DebuggerDisplayAttribute má jeden argument: řetězec, který se má zobrazit ve sloupci hodnoty pro instance typu. Tento řetězec může obsahovat složené závorky ({ a }). Text v páru složených závorek se vyhodnotí jako výraz. Například následující kód jazyka C# způsobí, že se při výběru znaménka plus (+) pro rozšíření zobrazení ladicího programu instance MyHashtable zobrazí "Count = 4".
[DebuggerDisplay("Count = {count}")]
class MyHashtable
{
public int count = 4;
}
Atributy použité u vlastností odkazovaných ve výrazu se nezpracují. Pro kompilátor jazyka C# je povolený obecný výraz, který má pouze implicitní přístup k tomuto odkazu pro aktuální instanci cílového typu. Výraz je omezený; nemá přístup k aliasům, lokálům ani ukazatelům. V kódu jazyka C# můžete použít obecný výraz mezi složenými závorkami, který má implicitní přístup k this ukazateli pouze pro aktuální instanci cílového typu.
Pokud má například objekt jazyka C# přepsání ToString(), ladicí program zavolá přepsání a zobrazí jeho výsledek místo standardního {<typeName>}.. Pokud jste přepsali ToString(), není nutné použít DebuggerDisplayAttribute. Pokud použijete obojí, DebuggerDisplayAttribute má atribut přednost před ToString() přepsáním.
Použití ladicího programuBrowsableAttribute
DebuggerBrowsableAttribute Použijte pole nebo vlastnost k určení způsobu zobrazení pole nebo vlastnosti v okně ladicího programu. Konstruktor pro tento atribut přebírá jednu z hodnot výčtu DebuggerBrowsableState , která určuje jeden z následujících stavů:
Never označuje, že člen není zobrazen v okně dat. Například použití této hodnoty na poli DebuggerBrowsableAttribute odebere pole z hierarchie; pole se při rozbalení typu nezobrazí kliknutím na znaménko plus (+) u instance typu.
Collapsed označuje, že člen je zobrazen, ale není rozbalený ve výchozím nastavení. Toto je výchozí chování.
RootHidden označuje, že samotný člen není zobrazen, ale jeho základní objekty jsou zobrazeny, pokud se jedná o pole nebo kolekci.
Poznámka:
Funkce DebuggerBrowsableAttribute není podporována ve Visual Basic v .NET Framework verze 2.0.
Následující příklad kódu ukazuje použití DebuggerBrowsableAttribute k zabránění zobrazení vlastnosti, která jej následuje, v okně ladění pro třídu.
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public static string y = "Test String";
Použití DebuggerTypeProxy
DebuggerTypeProxyAttribute Atribut použijte, pokud potřebujete výrazně a zásadně změnit zobrazení ladění typu, ale ne změnit samotný typ. Atribut DebuggerTypeProxyAttribute se používá k určení proxy zobrazení pro typ, což umožňuje vývojáři přizpůsobit zobrazení pro typ. Tento atribut, jako je například DebuggerDisplayAttribute, lze použít na úrovni sestavení, v takovém případě Target vlastnost určuje typ, pro který bude proxy použit. Doporučené použití spočívá v tom, že tento atribut určuje privátní vnořený typ, který se vyskytuje v rámci typu, na který se atribut použije. Vyhodnocovače výrazů, který podporuje prohlížeče typů, kontroluje tento atribut při zobrazení typu. Pokud se atribut najde, vyhodnocovač výrazu nahradí typ, na který se atribut aplikuje, typem zobrazení proxy.
Pokud je DebuggerTypeProxyAttribute přítomen, okno proměnné ladicího programu zobrazuje pouze veřejné prvky typu proxy. Soukromé členy se nezobrazují. Zobrazení s rozšířenými atributy nemění chování datového okna.
Aby se předešlo zbytečným sankcím za výkon, atributy zobrazovací proxy se nezpracovávají, dokud se objekt nerozbalí, buď tak, že uživatel klikne na znaménko plus (+) vedle typu v okně dat, nebo prostřednictvím aplikace atributu DebuggerBrowsableAttribute. Proto se doporučuje, aby nebyly použity žádné atributy pro typ zobrazení. Atributy lze a měly by být použity v textu typu zobrazení.
Následující příklad kódu ukazuje použití DebuggerTypeProxyAttribute k určení typu, který se má použít jako zástupce pro zobrazení v ladicím nástroji.
[DebuggerTypeProxy(typeof(HashtableDebugView))]
class MyHashtable : Hashtable
{
private const string TestString =
"This should not appear in the debug window.";
internal class HashtableDebugView
{
private Hashtable hashtable;
public const string TestStringProxy =
"This should appear in the debug window.";
// The constructor for the type proxy class must have a
// constructor that takes the target type as a parameter.
public HashtableDebugView(Hashtable hashtable)
{
this.hashtable = hashtable;
}
}
}
Příklad
Popis
Následující příklad kódu lze zobrazit v sadě Visual Studio, aby se zobrazily výsledky použití DebuggerDisplayAttributeDebuggerBrowsableAttribute, a DebuggerTypeProxyAttribute atributů.
Kód
using namespace System;
using namespace System::Collections;
using namespace System::Diagnostics;
using namespace System::Reflection;
ref class HashtableDebugView;
[DebuggerDisplay("{value}", Name = "{key}")]
ref class KeyValuePairs
{
private:
IDictionary^ dictionary;
Object^ key;
Object^ value;
public:
KeyValuePairs(IDictionary^ dictionary, Object^ key, Object^ value)
{
this->value = value;
this->key = key;
this->dictionary = dictionary;
}
};
[DebuggerDisplay("Count = {Count}")]
[DebuggerTypeProxy(HashtableDebugView::typeid)]
ref class MyHashtable : Hashtable
{
private:
static const String^ TestString = "This should not appear in the debug window.";
internal:
ref class HashtableDebugView
{
private:
Hashtable^ hashtable;
public:
static const String^ TestString = "This should appear in the debug window.";
HashtableDebugView(Hashtable^ hashtable)
{
this->hashtable = hashtable;
}
[DebuggerBrowsable(DebuggerBrowsableState::RootHidden)]
property array<KeyValuePairs^>^ Keys
{
array<KeyValuePairs^>^ get()
{
array<KeyValuePairs^>^ keys = gcnew array<KeyValuePairs^>(hashtable->Count);
IEnumerator^ ie = hashtable->Keys->GetEnumerator();
int i = 0;
Object^ key;
while (ie->MoveNext())
{
key = ie->Current;
keys[i] = gcnew KeyValuePairs(hashtable, key, hashtable[key]);
i++;
}
return keys;
}
}
};
};
public ref class DebugViewTest
{
private:
// The following constant will appear in the debug window for DebugViewTest.
static const String^ TabString = " ";
public:
// The following DebuggerBrowsableAttribute prevents the property following it
// from appearing in the debug window for the class.
[DebuggerBrowsable(DebuggerBrowsableState::Never)]
static String^ y = "Test String";
static void Main()
{
MyHashtable^ myHashTable = gcnew MyHashtable();
myHashTable->Add("one", 1);
myHashTable->Add("two", 2);
Console::WriteLine(myHashTable->ToString());
Console::WriteLine("In Main.");
}
};
int main()
{
DebugViewTest::Main();
}
using System;
using System.Collections;
using System.Diagnostics;
using System.Reflection;
class DebugViewTest
{
// The following constant will appear in the debug window for DebugViewTest.
const string TabString = " ";
// The following DebuggerBrowsableAttribute prevents the property following it
// from appearing in the debug window for the class.
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public static string y = "Test String";
static void Main()
{
MyHashtable myHashTable = new MyHashtable();
myHashTable.Add("one", 1);
myHashTable.Add("two", 2);
Console.WriteLine(myHashTable.ToString());
Console.WriteLine("In Main.");
}
}
[DebuggerDisplay("{value}", Name = "{key}")]
internal class KeyValuePairs
{
private IDictionary dictionary;
private object key;
private object value;
public KeyValuePairs(IDictionary dictionary, object key, object value)
{
this.value = value;
this.key = key;
this.dictionary = dictionary;
}
}
[DebuggerDisplay("Count = {Count}")]
[DebuggerTypeProxy(typeof(HashtableDebugView))]
class MyHashtable : Hashtable
{
private const string TestString = "This should not appear in the debug window.";
internal class HashtableDebugView
{
private Hashtable hashtable;
public const string TestString = "This should appear in the debug window.";
public HashtableDebugView(Hashtable hashtable)
{
this.hashtable = hashtable;
}
[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
public KeyValuePairs[] Keys
{
get
{
KeyValuePairs[] keys = new KeyValuePairs[hashtable.Count];
int i = 0;
foreach(object key in hashtable.Keys)
{
keys[i] = new KeyValuePairs(hashtable, key, hashtable[key]);
i++;
}
return keys;
}
}
}
}
Imports System.Collections
Imports System.Diagnostics
Imports System.Reflection
Class DebugViewTest
' The following constant will appear in the debug window for DebugViewTest.
Const TabString As String = " "
' The following DebuggerBrowsableAttribute prevents the property following it
' from appearing in the debug window for the class.
<DebuggerBrowsable(DebuggerBrowsableState.Never)> _
Public Shared y As String = "Test String"
Shared Sub Main()
Dim myHashTable As New MyHashtable()
myHashTable.Add("one", 1)
myHashTable.Add("two", 2)
Console.WriteLine(myHashTable.ToString())
Console.WriteLine("In Main.")
End Sub
End Class
<DebuggerDisplay("{value}", Name:="{key}")> _
Friend Class KeyValuePairs
Private dictionary As IDictionary
Private key As Object
Private value As Object
Public Sub New(ByVal dictionary As IDictionary, ByVal key As Object, ByVal value As Object)
Me.value = value
Me.key = key
Me.dictionary = dictionary
End Sub
End Class
<DebuggerDisplay("Count = {Count}"), DebuggerTypeProxy(GetType(MyHashtable.HashtableDebugView))> _
Class MyHashtable
Inherits Hashtable
Private Const TestString As String = "This should not appear in the debug window."
Friend Class HashtableDebugView
Private hashtable As Hashtable
Public Shared TestString As String = "This should appear in the debug window."
Public Sub New(ByVal hashtable As Hashtable)
Me.hashtable = hashtable
End Sub
<DebuggerBrowsable(DebuggerBrowsableState.RootHidden)> _
ReadOnly Property Keys as KeyValuePairs()
Get
Dim nkeys(hashtable.Count - 1) As KeyValuePairs
Dim i as Integer = 0
For Each key As Object In hashtable.Keys
nkeys(i) = New KeyValuePairs(hashtable, key, hashtable(key))
i = i + 1
Next
Return nkeys
End Get
End Property
End Class
End Class