//New .NET 2.0 Debugger Attributes examples //Julie Lerman www.thedatafarm.com //from my session on Customized Debugging in VS2005 using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; using System.Data; using System.Data.SqlClient; namespace DebuggerTests { //note: DebuggerBrowsable is not in VB.NET //DebuggerDisplay work a little differently n C# and VB ... check MSDN documentation for nuances /// /// PLAIN Employee Class /// public class EmployeeClassPlain { private string _firstname; private string _lastname; private AddressClass _address; public EmployeeClassPlain(string firstname, string lastname, string street, string city) { _firstname = firstname; _lastname = lastname; _address = new AddressClass(street, city); } public string FirstName { get { return _firstname; } set { _firstname = value; } } public string LastName { get { return _lastname; } set { _lastname = value; } } public AddressClass Address { get { return _address; } } /// /// ADDRESS Class /// public class AddressClass { private string _street; private string _city; public AddressClass(string street, string city) { _street = street; _city = city; } public string Street { get { return _street; } set { _street = value; } } public string City { get { return _city; } set { _city = value; } } } } //use proxy for dramatic change to class display without changing the class [DebuggerDisplay("{_lastname}, {_firstname}")] // [DebuggerTypeProxy(typeof(EmployeeProxyView))] public class EmployeeClassFancy { //hide this from the class view [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string _firstname; [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string _lastname; //hide root: (address) and make children (street,city,state) on level of root [DebuggerBrowsable(DebuggerBrowsableState.Never)] private AddressClass _address; public EmployeeClassFancy(string firstname, string lastname, string street, string city) { _firstname = firstname; _lastname = lastname; _address = new AddressClass(street, city); //sales = new DataTable(); //products = new DataTable(); //GetData(ref sales, ref products); } public string FirstName { get { return _firstname; } set { _firstname = value; } } public string LastName { get { return _lastname; } set { _lastname = value; } } [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] public AddressClass Address { get { return _address; } } public class AddressClass { [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string _street; [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string _city; public AddressClass(string street, string city) { _street = street; _city = city; } public string Street { get { return _street; } set { _street = value; } } public string City { get { return _city; } set { _city = value; } } } } //proxy for debug view of employee class class EmployeeProxyView { private EmployeeClassFancy emp; public EmployeeProxyView(EmployeeClassFancy EMP) { this.emp = EMP; } public string Name { get { return emp.FirstName + " " + emp.LastName; } } } public class DebuggerAttributes { static void Main() { EmployeeListPlain eP = new EmployeeListPlain(); eP.BuildEmployeeList(); EmployeeListFancy eF = new EmployeeListFancy(); eF.BuildEmployeeList(); } } public class EmployeeListPlain { List emps; public void BuildEmployeeList() { emps = new List(); emps.Add(new EmployeeClassPlain("Julie", "Lerman", "Main Rd", "Treeville")); emps.Add(new EmployeeClassPlain("Calvin", "Coolidge", "River Rd", "Fairfield")); emps.Add(new EmployeeClassPlain("Jim", "Jeffords", "College Street", "Burlington")); } } [System.Diagnostics.DebuggerDisplay("Employee List")] public class EmployeeListFancy { //nicer view of the list in debugger [System.Diagnostics.DebuggerDisplay("# Employees: {emps.Count}")] List emps; public void BuildEmployeeList() { emps = new List(); emps.Add(new EmployeeClassFancy("Julie", "Lerman", "Main Rd", "Treeville")); emps.Add(new EmployeeClassFancy("Calvin", "Coolidge", "River Rd", "VT")); emps.Add(new EmployeeClassFancy("Jim", "Jeffords", "College Street", "Burlington")); } } }