Gỡ lỗi C #: [DebuggerDisplay] hay ToString ()?


92

Có hai cách để tăng tính hữu ích của thông tin gỡ lỗi thay vì nhìn thấy {MyNamespace.MyProject.MyClass}trong trình gỡ lỗi.

Đây là cách sử dụng DebuggerDisplayAttributeToString()phương pháp.

using System.Diagnostics;
...

[DebuggerDisplay("Name = {Name}")]
public class Person
{
    public string Name;
}

hoặc là

public class Person
{
    public string Name;
    public override string ToString()
    {
        return string.Format("Name = {0}", Name);
    }
}

Có lý do gì để thích cái này hơn cái kia không? Có lý do gì để không làm cả hai? Đó hoàn toàn là sở thích cá nhân?

Câu trả lời:


94

Việc sử dụng [DebuggerDisplay]chỉ dành cho trình gỡ lỗi. Ghi đè ToString () có "tác dụng phụ" là thay đổi hiển thị trong thời gian chạy.

Đây có thể là một điều tốt hoặc không.

Thông thường, bạn muốn có nhiều thông tin hơn trong quá trình gỡ lỗi so với ToString()đầu ra tiêu chuẩn của mình , trong trường hợp đó, bạn sẽ sử dụng cả hai.

Ví dụ: trong trường hợp của bạn, việc triển khai "ToString" có vẻ kỳ lạ đối với tôi. Tôi mong đợi một triển khai ToString () của lớp "Người" chỉ trực tiếp trả về Tên, không phải "Tên = Người tên". Tuy nhiên, trong quá trình gỡ lỗi, tôi có thể muốn thêm thông tin đó.


9
+1 Để thêm vào điểm "tác dụng phụ" của Reed: ToStringthường được sử dụng như một "chuỗi hiển thị mặc định", ví dụ: bằng Console.WriteLinehoặc liên kết dữ liệu WPF.
Stephen Cleary

Chắc chắn rồi; định dạng của chuỗi chỉ được đưa ra cho một ví dụ trực quan để nhấn mạnh sự tương tự của nó với chuỗi được cung cấp cho DebuggerDisplay. Định dạng DebuggerDisplay cũng có thể trả về tên trực tiếp, như bạn nói. Tôi hiểu quan điểm của bạn về tác dụng phụ - đó là kiểu phân biệt mà tôi đang tìm kiếm. Tôi thường không sử dụng phương thức ToString trên các lớp nhiều (ngoại trừ mục đích tôi đã đưa ra ở trên) nên các cách sử dụng khác của nó không rõ ràng đối với tôi. Cảm ơn!
bwerks

5

"Khi bạn tạo một lớp hoặc cấu trúc tùy chỉnh, bạn nên ghi đè phương thức ToString để cung cấp thông tin về loại của bạn cho mã khách hàng." - MSDN

Nếu những gì ToString()trả về và bạn thấy trong trình gỡ lỗi không phải là những gì bạn muốn thì bạn sử dụng DebuggerDisplayAttribute.


4

Độ chậm của trình gỡ lỗi cũng có thể được tính đến:

DebuggerDisplayAttributebiểu thức định dạng được trình gỡ lỗi diễn giải sau mỗi bước gỡ lỗi / điểm ngắt.

ToStringđược biên dịch trong mã của bạn và do đó trình gỡ lỗi sẽ thực thi nhanh hơn nhiều.

Điều đó cũng tương tự với các điểm ngắt có điều kiện: Nếu biểu thức điều kiện quá chậm để trình gỡ lỗi diễn giải mỗi khi thực thi đạt đến điểm ngắt, có thể hữu ích nếu xóa điểm ngắt và thay vào đó thêm mã tạm thời như sau: if (condition) Debugger.Break();

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.