Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
Questo articolo è specifico di .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .NET 6 e versioni successive.
Gli attributi di visualizzazione del debugger consentono allo sviluppatore del tipo, che ne specifica e comprende meglio il comportamento di runtime, di indicarne anche l'aspetto quando viene visualizzato in un debugger. Inoltre, gli attributi di visualizzazione del debugger che forniscono una Target proprietà possono essere applicati a livello di assembly dagli utenti senza conoscere il codice sorgente. L'attributo DebuggerDisplayAttribute controlla la modalità di visualizzazione di un tipo o di un membro nelle finestre delle variabili del debugger. L'attributo DebuggerBrowsableAttribute determina se e come viene visualizzato un campo o una proprietà nelle finestre delle variabili del debugger. L'attributo DebuggerTypeProxyAttribute specifica un tipo sostitutivo, o un proxy, per un tipo e modifica la modalità di visualizzazione del tipo nelle finestre del debugger. Quando si visualizza una variabile con un proxy o un tipo sostitutivo, il proxy sostituisce e rappresenta il tipo originale nella finestra di visualizzazione del debugger. La finestra della variabile del debugger visualizza solo i membri pubblici del tipo proxy. I membri privati non vengono visualizzati.
L'uso di DebuggerDisplayAttribute
Il DebuggerDisplayAttribute costruttore ha un singolo argomento: una stringa da visualizzare nella colonna valore per le istanze del tipo. Questa stringa può contenere parentesi graffe ({ e }). Il testo all'interno di una coppia di parentesi graffe viene valutato come espressione. Ad esempio, il codice C# seguente determina la visualizzazione di "Count = 4" quando si seleziona il segno più (+) per espandere la visualizzazione del debugger per un'istanza di MyHashtable.
[DebuggerDisplay("Count = {count}")]
class MyHashtable
{
public int count = 4;
}
Gli attributi applicati alle proprietà a cui si fa riferimento nell'espressione non vengono elaborati. Per il compilatore C#, è consentita un'espressione generale che ha accesso implicito solo a questo riferimento per l'istanza corrente del tipo di destinazione. L'espressione è limitata; non è possibile accedere a alias, variabili locali o puntatori. Nel codice C#, è possibile usare un'espressione generale nelle parentesi graffe che possiede un accesso implicito al puntatore this solo per l'istanza corrente del tipo di destinazione.
Ad esempio, se un oggetto C# ha un override ToString(), il debugger chiamerà l'override e mostrerà il risultato anziché lo standard {<typeName>}., pertanto, se è stato eseguito l'override di ToString(), non è necessario usare DebuggerDisplayAttribute. Se si usano entrambi, l'attributo ha la DebuggerDisplayAttribute precedenza sull'override ToString() .
L'uso dell'attributo DebuggerBrowsableAttribute
Applicare a DebuggerBrowsableAttribute un campo o una proprietà per specificare come il campo o la proprietà devono essere visualizzati nella finestra del debugger. Il costruttore per questo attributo accetta uno dei valori dell'enumerazione DebuggerBrowsableState, che specifica uno degli stati seguenti:
Never indica che il membro non viene visualizzato nella finestra dei dati. Ad esempio, l'utilizzo di questo valore per il DebuggerBrowsableAttribute in un campo rimuove il campo dalla gerarchia; il campo non viene visualizzato quando si espande il tipo circostante facendo clic sul segno più (+) per l'istanza del tipo.
Collapsed indica che il membro viene visualizzato ma non espanso per impostazione predefinita. Si tratta del comportamento predefinito.
RootHidden indica che il membro stesso non viene visualizzato, ma i relativi oggetti costitutivi vengono visualizzati se si tratta di una matrice o di una raccolta.
Annotazioni
DebuggerBrowsableAttribute non è supportato da Visual Basic nella versione 2.0 di .NET Framework.
Nell'esempio di codice seguente viene illustrato l'uso di DebuggerBrowsableAttribute per impedire la visualizzazione della proprietà seguente nella finestra di debug per la classe .
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public static string y = "Test String";
Uso di DebuggerTypeProxy
Usare l'attributo DebuggerTypeProxyAttribute quando è necessario modificare significativamente e fondamentalmente la visualizzazione di debug di un tipo, ma non modificare il tipo stesso. L'attributo DebuggerTypeProxyAttribute viene usato per specificare un proxy di visualizzazione per un tipo, consentendo a uno sviluppatore di personalizzare la visualizzazione per il tipo. Questo attributo, ad esempio DebuggerDisplayAttribute, può essere usato a livello di assembly, nel qual caso la Target proprietà specifica il tipo per cui verrà usato il proxy. L'utilizzo consigliato è che questo attributo specifica un tipo annidato privato che si verifica all'interno del tipo a cui viene applicato l'attributo. Analizzatore di espressioni che supporta visualizzatori di tipi controlla la presenza di questo attributo quando viene visualizzato un tipo. Se l'attributo viene trovato, l'analizzatore di espressioni sostituisce il tipo proxy di visualizzazione per il tipo a cui viene applicato l'attributo.
DebuggerTypeProxyAttribute Quando è presente, la finestra della variabile del debugger visualizza solo i membri pubblici del tipo proxy. I membri privati non vengono visualizzati. Il comportamento della finestra dei dati non viene modificato dalle visualizzazioni arricchite dagli attributi.
Per evitare inutili impatti sulle prestazioni, gli attributi del proxy di visualizzazione non vengono elaborati fino a quando l'oggetto non viene espanso, sia tramite il clic dell'utente sul segno più (+) nella finestra dei dati, sia attraverso l'applicazione dell'attributo DebuggerBrowsableAttribute. Pertanto, è consigliabile non applicare attributi al tipo di visualizzazione. Gli attributi possono e devono essere applicati all'interno del corpo del tipo di visualizzazione.
Nell'esempio di codice seguente viene illustrato l'uso di DebuggerTypeProxyAttribute per specificare un tipo da usare come proxy di visualizzazione del debugger.
[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;
}
}
}
Esempio
Descrizione
L'esempio di codice seguente può essere visualizzato in Visual Studio per visualizzare i risultati dell'applicazione degli DebuggerDisplayAttributeattributi , DebuggerBrowsableAttributee DebuggerTypeProxyAttribute .
Codice
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