सी # डिबगिंग: [डिबगरडिसप्ले] या ट्यूरिंग ()?


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 () कार्यान्वयन सीधे नाम वापस करने के लिए होगा, न कि "Name = PersonsName"। हालाँकि, डिबगिंग के दौरान, मैं वह अतिरिक्त जानकारी चाहता हूँ।


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

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

5

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

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


4

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

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

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

सशर्त विराम बिंदुओं के साथ भी ऐसा ही है: यदि सशर्त अभिव्यक्ति डीबगर द्वारा व्याख्या करने के लिए बहुत धीमी है, तो हर बार निष्पादन ब्रेकपॉइंट तक पहुंचता है, यह विराम बिंदु को हटाने के लिए उपयोगी हो सकता है और इसके बजाय इस तरह अस्थायी कोड जोड़ सकता है: if (condition) Debugger.Break();

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.