Aracılığıyla paylaş


Hata Ayıklayıcı Görüntü Öznitelikleriyle Hata Ayıklamayı Geliştirme

Uyarı

Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.

Hata ayıklayıcısı görüntüleme öznitelikleri, bu türün çalışma zamanı davranışını belirten ve en iyi anlayan türün geliştiricisinin, bir hata ayıklayıcıda görüntülendiğinde bu türün nasıl görüneceğini belirtmesini sağlar. Ayrıca, bir Target özellik sağlayan hata ayıklayıcısı görüntüleme öznitelikleri, kaynak kodu bilgisi olmayan kullanıcılar tarafından derleme düzeyinde uygulanabilir. özniteliği, DebuggerDisplayAttribute hata ayıklayıcı değişken pencerelerinde bir türün veya üyenin nasıl görüntüleneceğini denetler. özniteliği, DebuggerBrowsableAttribute hata ayıklayıcı değişken pencerelerinde bir alanın veya özelliğin görüntülenip görüntülenmediğini ve nasıl görüntüleneceğini belirler. DebuggerTypeProxyAttribute özniteliği, bir tür için bir alternatif tür veya ara sunucu belirtir ve türün hata ayıklayıcı pencerelerinde görüntülenme şeklini değiştirir. Vekil veya yedek türe sahip bir değişkeni görüntülediğinizde, vekil hata ayıklayıcı görüntüleme penceresinde özgün tür yerine geçer. Hata ayıklayıcısı değişken penceresi yalnızca ara sunucu türünün genel üyelerini görüntüler. Özel üyeler görüntülenmez.

DebuggerDisplayAttribute Kullanma

Oluşturucunun DebuggerDisplayAttribute tek bir bağımsız değişkeni vardır: tür örnekleri için değer sütununda görüntülenecek bir dize. Bu dize küme ayraçları ({ ve }) içerebilir. Bir küme ayracı çifti içindeki metin bir ifade olarak değerlendirilir. Örneğin, aşağıdaki C# kodu MyHashtable örneğinin hata ayıklayıcı görüntüsünü genişletmek için artı işareti (+) seçildiğinde "Sayı = 4" ifadesinin görüntülenmesine neden olur.

[DebuggerDisplay("Count = {count}")]
class MyHashtable
{
    public int count = 4;
}

İfadede başvuruda bulunan özelliklere uygulanan öznitelikler işlenmez. C# derleyicisinde, hedef türün mevcut örneğinin bu referansa sadece dolaylı erişimi olan genel bir ifadeye izin verilir. İfade sınırlıdır; takma adlara, yerel değişkenlere veya işaretçilere erişim yoktur. C# kodunda, yalnızca hedef türün geçerli örneği için this işaretçisine örtük erişim sağlayan ayraçlar arasına bir ifadeyi genel bir şekilde yerleştirebilirsiniz.

Örneğin, bir C# nesnesinin ToString()geçersiz kılınmış bir nesnesi varsa, hata ayıklayıcı geçersiz kılmayı çağırır ve sonucu standart {<typeName>}. yerine gösterir Böylece, geçersiz kıldıysanız ToString()kullanmanız DebuggerDisplayAttributegerekmez. Her ikisini de kullanırsanız, DebuggerDisplayAttribute özniteliği ToString() geçersiz kılmaktan daha önceliklidir.

DebuggerBrowsableAttribute Kullanma

Alanın veya özelliğin DebuggerBrowsableAttribute hata ayıklayıcı penceresinde nasıl görüntüleneceğini belirtmek için bir alana veya özelliğe uygulayın. Bu özniteliğin oluşturucu, aşağıdaki durumlardan DebuggerBrowsableState birini belirten numaralandırma değerlerinden birini alır:

  • Never , üyenin veri penceresinde görüntülenmediğini gösterir. Örneğin, bir alanda için DebuggerBrowsableAttribute bu değerin kullanılması alanı hiyerarşiden kaldırır; alan, tür örneğinin artı işaretine (+) tıklayarak kapsayan türü genişlettiğiniz zaman görüntülenmez.

  • Collapsed üyenin görüntülendiğini ancak varsayılan olarak genişletilmediğini gösterir. Bu, varsayılan davranıştır.

  • RootHidden , üyenin kendisinin gösterilmediğini, ancak bir dizi veya koleksiyonsa, bağlı nesnelerinin görüntülendiğini gösterir.

Uyarı

DebuggerBrowsableAttribute, .NET Framework sürüm 2.0'da Visual Basic tarafından desteklenmez.

Aşağıdaki kod örneği, bir sınıftaki sonraki özelliğin hata ayıklama penceresinde görünmesini önlemek için DebuggerBrowsableAttribute'nin kullanımını gösterir.

[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public static string y = "Test String";

DebuggerTypeProxy Kullanma

Bir türün DebuggerTypeProxyAttribute hata ayıklama görünümünü önemli ölçüde ve temel olarak değiştirmeniz gerektiğinde ancak türün kendisini değiştirmediğinizde özniteliğini kullanın. Bu DebuggerTypeProxyAttribute özniteliği, bir tür için görüntü proxy'si belirtmek ve bir geliştiricinin türün görünümünü uyarlamasına olanak sağlamak için kullanılır. gibi DebuggerDisplayAttributebu öznitelik, derleme düzeyinde kullanılabilir ve bu durumda Target özelliği ara sunucunun kullanılacağı türü belirtir. Önerilen kullanım, bu özniteliğin özniteliğin uygulandığı tür içinde oluşan özel bir iç içe türü belirtmesidir. Tür görüntüleyicilerini destekleyen bir ifade değerlendiricisi, bir tür görüntülendiğinde bu özniteliği denetler. Öznitelik bulunursa, ifade değerlendirici, özniteliğin uygulandığı türü, görsel vekil türü ile değiştirir.

DebuggerTypeProxyAttribute mevcut olduğunda, hata ayıklayıcısı değişken penceresi yalnızca ara sunucu türünün genel üyelerini görüntüler. Özel üyeler görüntülenmez. Veri penceresinin davranışı, öznitelik tarafından geliştirilmiş görünümler tarafından değiştirilmez.

Gereksiz performans cezalarını önlemek için, veri penceresindeki türün yanındaki artı işaretine (+) kullanıcı tarafından tıklanarak ya da DebuggerBrowsableAttribute özniteliğinin uygulanmasıyla nesne genişletilene kadar görüntüleme vekilinin öznitelikleri işlenmez. Bu nedenle, görüntü türüne hiçbir öznitelik uygulanmamış olması önerilir. Öznitelikler, görüntüleme türünün gövdesi içinde uygulanabilir ve uygulanmalıdır.

Aşağıdaki kod örneği, bir türü hata ayıklayıcı görüntü proxy'si olarak belirtmek için DebuggerTypeProxyAttribute öğesinin kullanımını gösterir.

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

Örnek

Açıklama

Aşağıdaki kod örneği, , DebuggerDisplayAttributeve DebuggerBrowsableAttribute özniteliklerini uygulamanın DebuggerTypeProxyAttributesonuçlarını görmek için Visual Studio'da görüntülenebilir.

Kod


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

Ayrıca bakınız