การดีบัก C #: [DebuggerDisplay] หรือ ToString ()?


92

มีสองวิธีในการเพิ่มประโยชน์ของการดีบักข้อมูลแทนที่จะเห็น{MyNamespace.MyProject.MyClass}ในดีบักเกอร์

นี่คือการใช้DebuggerDisplayAttributeและToString()วิธีการ

using System.Diagnostics;
...

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

หรือ

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

มีเหตุผลใดที่จะชอบอีกฝ่ายหนึ่ง? มีเหตุผลใดที่จะไม่ทำทั้งสองอย่าง? เป็นความชอบส่วนตัวล้วนๆ?

คำตอบ:


94

การใช้[DebuggerDisplay]มีไว้สำหรับดีบักเกอร์เท่านั้น การแทนที่ ToString () มี "ผลข้างเคียง" ในการเปลี่ยนการแสดงผลขณะรันไทม์

นี่อาจจะเป็นเรื่องดีหรือไม่ก็ได้

บ่อยครั้งคุณต้องการข้อมูลเพิ่มเติมระหว่างการดีบักมากกว่าToString()เอาต์พุตมาตรฐานของคุณซึ่งในกรณีนี้คุณจะใช้ทั้งสองอย่าง

ตัวอย่างเช่นในกรณีของคุณการใช้งาน "ToString" ดูเหมือนจะแปลกสำหรับฉัน ฉันคาดหวังให้การใช้งาน ToString () คลาส "บุคคล" เพียงแค่ส่งคืนชื่อโดยตรงไม่ใช่ "Name = PersonsName" อย่างไรก็ตามในระหว่างการดีบักฉันอาจต้องการข้อมูลเพิ่มเติมดังกล่าว


9
+1 ในการเพิ่มจุด "side effect" ของ Reed: ToStringมักใช้เป็น "default display string" เช่น by Console.WriteLineหรือ WPF data binding
Stephen Cleary

แน่นอน; รูปแบบของสตริงถูกกำหนดให้เป็นตัวอย่างภาพเพื่อเน้นความคล้ายคลึงกับสตริงที่กำหนดให้สำหรับ DebuggerDisplay รูปแบบ DebuggerDisplay สามารถส่งคืนชื่อได้โดยตรงตามที่คุณพูด ฉันเห็นประเด็นของคุณเกี่ยวกับผลข้างเคียง - มันเป็นความแตกต่างที่ฉันกำลังมองหา โดยทั่วไปฉันไม่ได้ใช้วิธี ToString ในชั้นเรียนมากนัก (ยกเว้นเพื่อวัตถุประสงค์ที่ฉันให้ไว้ข้างต้น) ดังนั้นการใช้งานอื่น ๆ จึงไม่ชัดเจนสำหรับฉัน ขอบคุณ!
bwerks

5

"เมื่อคุณสร้างคลาสหรือโครงสร้างแบบกำหนดเองคุณควรแทนที่เมธอด ToString เพื่อให้ข้อมูลเกี่ยวกับประเภทของคุณไปยังโค้ดไคลเอ็นต์" - MSDN

หากสิ่งที่ส่งกลับและคุณจะเห็นในการดีบักไม่ได้เป็นสิ่งที่คุณต้องการแล้วคุณใช้ToString()DebuggerDisplayAttribute


4

นอกจากนี้ยังสามารถพิจารณาความช้าของดีบักเกอร์:

DebuggerDisplayAttributeนิพจน์รูปแบบถูกตีความโดยดีบักเกอร์หลังจากการดีบักแต่ละขั้นตอน / เบรกพอยต์

ToStringถูกรวบรวมในโค้ดของคุณดังนั้นจึงเร็วกว่ามากในการดำเนินการโดยดีบักเกอร์

เช่นเดียวกันกับเบรกพอยต์ที่มีเงื่อนไข: หากนิพจน์เงื่อนไขช้าเกินไปที่จะตีความโดยดีบักเกอร์ทุกครั้งที่การดำเนินการถึงจุดพักจะมีประโยชน์ในการลบเบรกพอยต์และเพิ่มโค้ดชั่วคราวเช่นนี้แทน: if (condition) Debugger.Break();

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.