2010-02-26 18 views
10

मुझे डीबीओ/पीओसीओ कक्षाओं में से कई पर ToString() को ओवरराइड करना उपयोगी लगता है, जब मैं डीबगर के अंदर उदाहरणों पर होवर करते समय कुछ अच्छी जानकारी दिखाने के लिए लिखता हूं।क्या कक्षा में ToString() को स्वचालित रूप से ओवरराइड करने का कोई तरीका है?

public class IdValue<T> 
    { 
    public IdValue(int id, T value) 
    { 
     Id = id; 
     Value = value; 
    } 

    public int Id { get; private set; } 
    public T Value { get; private set; } 

    public override string ToString() 
    { 
     return string.Format("Id: {0} Value: {1}", Id, Value); 
    } 
    } 

वहाँ .NET में एक तरह से स्वचालित रूप से एक toString() ओवरराइड कि सार्वजनिक गुण बाहर सूचीबद्ध करता है या वहाँ एक अच्छा व्यवहार का पालन करने के लिए है के लिए है:

यहाँ एक उदाहरण है?

उत्तर

16

आप बेस क्लास में ToString को ओवरराइड कर सकते हैं और व्युत्पन्न कक्षा के सार्वजनिक गुणों को खोजने के लिए उदाहरण पर प्रतिबिंब का उपयोग कर सकते हैं। लेकिन यह संभवतः आपके कोड के अन्य क्षेत्रों में प्रदर्शन समस्याओं को पेश करेगा। इसके अतिरिक्त, क्योंकि ToString का उपयोग कई चीजों (स्ट्रिंग.फॉर्मैट, डिफ़ॉल्ट डेटा बाइंडिंग इत्यादि) द्वारा किया जाता है, डीबगिंग उद्देश्यों के लिए ToString ओवरराइड करने से आपकी कक्षाएं अन्य परिदृश्यों में कम उपयोगी हो जाएंगी।

इसके बजाय, आप डीबगर डिस्प्ले विशेषता का उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि डीबगर कैसे घड़ी विंडो में होवर टिप्स और जानकारी दिखाता है। मुझे यकीन है कि यह काम करता है यदि आप इसे बेस क्लास पर लागू करते हैं। आप कस्टम विज़ुअलाइज़र भी बना सकते हैं लेकिन यह अधिक शामिल है। डीबगर प्रदर्शन अनुभव को बढ़ाने के बारे में अधिक जानकारी के लिए इस लिंक को देखें।

Enhancing Debugging

+1

धन्यवाद! मुझे बस इतना करना था कि मैंने मूल रूप से पोस्ट की गई कक्षा में यह विशेषता जोड़ दी थी और जिस तरह से मैं चाहता था: [डीबगर डिस्प्ले ("आईडी: {आईडी} वैल्यू: {वैल्यू}")] –

0

यह एक अच्छा डिजाइन विचार नहीं है। मैं आपको उन मूल्यों को निकालने के लिए सलाह दूंगा जहां आपको उन्हें लॉग इन करने की आवश्यकता है या एक सहायक विधि है (आप System.Object पर एक्सटेंशन विधियों का उपयोग कर सकते हैं)।

0
यहाँ

एक तरह से है कि यह एक डिबगर के अनुकूल तरीके

public override string ToString() 
{ 
    stringBuilder sb = ... your usual string output 
    AppendDebug(sb); 
    return sb.Tostring(); 
} 


[Conditional("DEBUG")] 
private void AppendDebug(stringBuilder sb) 
{ 
    sb.Append(... debug - specific info) 

} 

[सशर्त] विशेषता में किया जा सकता है अपने प्रश्न के लिए महत्वपूर्ण है।

+2

सशर्त एट्रिब्यूट वास्तव में अधिक उद्देश्य के लिए है आप किसी अन्य कॉलर के लिए एक विधि का पर्दाफाश कर रहे हैं जिसका निर्माण कॉन्फ़िगरेशन आपको समय से पहले नहीं जानता है। इस मामले में आप #if DEBUG का उपयोग करके कॉल-साइट अस्पष्टता के बिना एक ही परिणाम प्राप्त कर सकते हैं। लेकिन यह एक बहुत उपयोगी और कम ज्ञात विशेषता है! – Josh

0

उन लोगों को सुनो जो आपको प्रदर्शन और/या डिजाइन विचारों के बारे में चेतावनी दे रहे हैं। जब आप विस्तार या सजावट का उपयोग करके अपनी जरूरतों को कम कर सकते हैं, तो आप एक सीमित सीमित आवश्यकता के अनुरूप व्यवहार को कसकर बाध्य कर रहे हैं।

0

आप एक बाहरी निर्भरता कोई आपत्ति नहीं है, तो आप एक रूपरेखा की तरह StatePrinter

अपने वस्तुओं के गुण के सभी मुद्रण एक उदाहरण उपयोग

class AClassWithToString 
{ 
    string B = "hello"; 
    int[] C = {5,4,3,2,1}; 

    // Nice stuff ahead! 
    static readonly StatePrinter printer = new StatePrinter(); 
    public override string ToString() 
    { 
    return printer.PrintObject(this); 
    } 
} 
1

आप JSON इस्तेमाल कर सकते हैं के साथ मदद करने के लिए बदल सकता है:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Web.Script.Serialization; 

namespace ConsoleApplication1 
{ 
    public class IdValue<T> 
    { 
     public IdValue(int id, T value) 
     { 
      Id = id; 
      Value = value; 
     } 

     public int Id { get; private set; } 
     public T Value { get; private set; } 

     public override string ToString() 
     { 
      return new JavaScriptSerializer().Serialize(this); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var idValue = new IdValue<string>(1, "Test"); 
      Console.WriteLine(idValue); 
      Console.ReadKey(); 
     } 
    } 
} 

कौन इस उत्पादन देता है:

{"आईडी": 1, "वैल्यू": "टेस्ट"}

संबंधित मुद्दे

 संबंधित मुद्दे