'DebuggerDisplay'에 해당되는 글 2건
- 2010.06.08 클래스의 정보 표현2
- 2010.06.06 클래스의 정보 표현
다음은 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");
}
}
위처럼 구성하면 아래와 같이 보이게 됩니다.
다음은 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임을 나타내고 있습니다.
두 번째의 경우 이름과 값이 같이 볼 수 있으므로 더 효율적인 디버깅이 가능할 것입니다.


