2010-07-06 10 views
61

डीबगर में {MyNamespace.MyProject.MyClass} देखने के बजाय डीबगिंग जानकारी की उपयोगिता को बढ़ाने के दो तरीके हैं।सी # डीबगिंग: [डीबगर डिस्प्ले] या ToString()?

ये 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); 
    } 
} 

वहाँ अन्य करने के लिए एक पसंद करते हैं करने के लिए किसी भी कारण है? दोनों कारण नहीं करने का कोई कारण? क्या यह पूरी तरह से निजी वरीयता है?

उत्तर

69

[DebuggerDisplay] का उपयोग केवल डीबगर के लिए है। ओवरराइड टूस्ट्रिंग() में रनटाइम पर डिस्प्ले को बदलने का "साइड इफेक्ट" है।

यह एक अच्छी बात हो सकती है या नहीं भी हो सकती है।

अक्सर, आप अपने मानक ToString() आउटपुट से डीबगिंग के दौरान अधिक जानकारी चाहते हैं, इस मामले में आप दोनों का उपयोग करेंगे।

उदाहरण के लिए, आपके मामले में, "ToString" कार्यान्वयन मेरे लिए अजीब लगता है। मैं एक "व्यक्ति" वर्ग ToString() कार्यान्वयन की अपेक्षा करता हूं कि वह नाम सीधे वापस लौटाए, न कि "नाम = व्यक्ति नाम"। हालांकि, डिबगिंग के दौरान, मुझे वह अतिरिक्त जानकारी चाहिए।

+7

+1 रीड के "साइड इफेक्ट" बिंदु पर जोड़ने के लिए: 'ToString' को अक्सर "डिफ़ॉल्ट प्रदर्शन स्ट्रिंग" के रूप में उपयोग किया जाता है, उदाहरण के लिए,' Console.WriteLine' या WPF डेटा बाइंडिंग द्वारा। –

+0

निश्चित रूप से; स्ट्रिंग का प्रारूप सिर्फ एक दृश्य उदाहरण के लिए दिया गया था ताकि डीबगर डिस्प्ले के लिए दी गई स्ट्रिंग के समानता पर जोर दिया जा सके। जैसा कि आप कहते हैं, डीबगर डिस्प्ले प्रारूप भी नाम को सीधे वापस कर सकता है। मैं साइड इफेक्ट्स के बारे में आपका बिंदु देखता हूं - यह एक तरह का भेद है जिसे मैं ढूंढ रहा हूं। मैं आम तौर पर कक्षाओं पर ToString विधि का उपयोग नहीं करता (मेरे द्वारा दिए गए उद्देश्य को छोड़कर) तो इसके अन्य उपयोग मेरे लिए उतने स्पष्ट नहीं थे। धन्यवाद! – bwerks

5

"जब आप कस्टम क्लास या स्ट्रक्चर बनाते हैं, तो आपको क्लाइंट कोड पर अपने प्रकार के बारे में जानकारी प्रदान करने के लिए ToString विधि को ओवरराइड करना चाहिए।" - MSDN

यदि ToString() रिटर्न और आप डीबगर में देखते हैं तो आप नहीं चाहते हैं तो आप DebuggerDisplayAttribute का उपयोग करें।

0

डिबगर का धीमापन भी ध्यान में रखा जा सकता है:

DebuggerDisplayAttribute प्रारूप अभिव्यक्ति प्रत्येक डिबगिंग कदम/ब्रेकप्वाइंट के बाद डिबगर द्वारा व्याख्या की है।

ToStringआपके कोड में संकलित है और इसलिए डीबगर द्वारा निष्पादित करने के लिए बहुत तेज़ है।

कि सशर्त breakpoints के साथ एक ही है: if (condition) Debugger.Break();

: सशर्त अभिव्यक्ति हर बार निष्पादन ब्रेकपाइंट तक पहुँचने डिबगर द्वारा व्याख्या करने के लिए बहुत धीमी है, तो यह ब्रेकप्वाइंट को हटाने और बजाय इस तरह अस्थायी कोड जोड़ने के लिए उपयोगी हो सकता है
संबंधित मुद्दे