'DebuggerDisplayAttribute'에 해당되는 글 2건

  1. 2010.06.08 클래스의 정보 표현2
  2. 2010.06.06 클래스의 정보 표현

클래스의 정보 표현2

|

다음은 MyClassCollection 클래스의 디버깅 시의 표현되는 정보입니다.

List<T>와는 다르게 내부의 요소의 값을 확인하는데 어려움이 존재합니다.
이것을 List<T>처럼 구성해 보겠습니다.

[System.Diagnostics.DebuggerDisplay("{Value}", Name = "{Name}")]
class MyClass
{
    public String Name;
    public String Value;

    public MyClass(String name, String value)
    {
        this.Name = name;
        this.Value = value;
    }
}

[System.Diagnostics.DebuggerDisplay("Count = {Count}")]
[System.Diagnostics.DebuggerTypeProxy(typeof(CollectionDebugView))]
class MyClassCollection : CollectionBase, ICollection
{
    public MyClass Add(String name, String value)
    {
        Int32 i = base.InnerList.Add(new MyClass(name, value));
        return base.InnerList[i] as MyClass;
    }
}

class CollectionDebugView
{
    private ICollection collection;

    public CollectionDebugView(ICollection collection)
    {
        this.collection = collection;
    }

    [System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.RootHidden)]
    public MyClass[] MyClasses
    {
        get
        {
            List<myclass> myClasses = new List<myclass>(collection.Count);
            foreach (object key in collection)
            {
                MyClass myClass = key as MyClass;
                if (myClass != null)
                {
                    myClasses.Add(myClass);
                }
            }
            return myClasses.ToArray();
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClassCollection col = new MyClassCollection();
        col.Add("Name1", "Value1");
    }
}

위처럼 구성하면 아래와 같이 보이게 됩니다.

이처럼 보이기 위하여 DebuggerTypeProxyAttribute와 DebuggerBrowsable를 이용하였습니다.

참조 : MSDN


And

클래스의 정보 표현

|

다음은 MyClass 클래스의 디버깅 시 표현되는 정보입니다.

확장을 해야 내부 정보의 확인이 가능합니다.
cls 오른쪽의 RiSvE.MyClass(클래스 명) 대신 value1(Value 필드)을 표현하고 싶을 경우에 두 가지 방법이 있습니다.

첫 번째 방법은 ToString 메서드를 오버라이드 하는 것입니다.

class MyClass
{
    public String Name;
    public String Value;

    public MyClass(String name, String value)
    {
        this.Name = name;
        this.Value = value;
    }

    public override string ToString()
    {
        return Value;
    }
}

 

두 번째 방법은 DebuggerDisplayAttribute 특성을 이용하는 것입니다.

[System.Diagnostics.DebuggerDisplay("{Value}", Name = "{Name}")]
class MyClass
{
    public String Name;
    public String Value;

    public MyClass(String name, String value)
    {
        this.Name = name;
        this.Value = value;
    }
}

첫 번째와 두 번째의 경우 결과가 비슷해 보이지만 List<T> 개체에 추가된 후에 보면 차이점이 발생합니다.

첫 번째의 경우입니다.
0번째 요소가 value1임을 나타내고 있습니다.

두 번째의 경우입니다.
name1 요소가 value1임을 나타내고 있습니다.

두 번째의 경우 이름과 값이 같이 볼 수 있으므로 더 효율적인 디버깅이 가능할 것입니다.

And
prev | 1 | next