ToString को ओवरराइड करना क्यों / कब उचित होगा?


103

मैं C # का अध्ययन कर रहा हूं और मुझे आश्चर्य है कि ओवरराइडिंग का बिंदु और लाभ क्या ToStringहो सकता है, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है।

क्या यह ओवरराइड के बिना एक सामान्य विधि का उपयोग करके कुछ सरल तरीके से किया जा सकता है?

public string GetToStringItemsHeadings
{
    get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); }
}


public override string ToString()
{
    string strOut = string.Format("{0,-20} {1, -20}", m_work, m_personal);
    return strOut;
}

4
निर्भर करता है कि क्या आप वास्तव में कहीं भी यूआई में ऑब्जेक्ट को प्रदर्शित करने के लिए इसका उपयोग करना चाहते हैं, अन्यथा यह आमतौर पर डिबगिंग के लिए ही है - आप वीएस की घड़ी की खिड़की में टॉसस्ट्रिंग आउटपुट देखेंगे। (लेकिन आप इसे क्लास की विशेषताओं के साथ भी प्राप्त कर सकते हैं।) आपको दिए गए शीर्षक और आउटपुट से ऐसा लगता है कि यह प्रोग्राम ऐसा उपयोग कर रहा है कि इसका उपयोग करके ऑब्जेक्ट को Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);समान या समान डंप किया जाए ।
रूप

2
मैं वास्तव में सवाल नहीं समझता। क्या इसे अलग तरीके से किया जा सकता है? हाँ। लेकिन आप इसे अलग तरीके से क्यों करना चाहते हैं
कोनराड रूडोल्फ

5
मैं वास्तव GetToStringमें संपत्ति के नाम पर छोड़ Console.WriteLine(obj.ItemHeadings)
दूंगा

और आइटमहैडिंग्स की संपत्ति को स्थिर होने के लिए बदलें क्योंकि इसे किसी भी "इस" की आवश्यकता नहीं है।
ईफ्लो

आप इस प्रश्न की जांच करना चाहते हैं: stackoverflow.com/questions/7906828/oo-design-advice-tostring
यूरी घेंसेव

जवाबों:


127
  • क्या आपको ओवरराइड करने की आवश्यकता है ToString? नहीं।

  • क्या आप किसी अन्य तरीके से अपनी वस्तु का एक स्ट्रिंग प्रतिनिधित्व प्राप्त कर सकते हैं? हाँ।

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

वस्तुतः,

Console.WriteLine(yourObject);

आह्वान करेगा yourObject.ToString()


13
हाँ। इसके अलावा इस MVC या ASP.Net विकास में बहुत उपयोगी है जहां @yourObjectऔर <%=yourObject%>"ToString एड" होने जा रहे हैं।
बेन लेश


3
ऐसे अभ्यास से सावधान रहें। सच्ची कहानी: एक छात्र ने एक विधि के साथ ToString को ओवरराइड किया जो स्ट्रिंग को वापस करने के अलावा, डेटा को बदल दिया। वह कार्यक्रम को डिबग कर रहा था, लेकिन जब कार्यक्रम एक ब्रेकपॉइंट पर खड़ा था, तो मान बदल रहा था। जाहिरा तौर पर - हर बार जब वह मूल्य की जाँच करता है ToString निष्पादित किया गया था - तो मान भले ही बदल रहा था, लेकिन कार्यक्रम नहीं चल रहा था।
जेएनएफ

3
@JNF "ऐसी प्रैक्टिस" क्या है? ToStringवास्तव में एक वस्तु की स्थिति को नहीं बदलना चाहिए। लेकिन यह वह नहीं है जिसकी मैंने वकालत की थी।
कोनराड रुडोल्फ़

8
@ जेएनएफ मुझे यह स्वीकार नहीं है। ओवरराइड करने ToStringका मतलब है। अवधि। इस कथन पर एक चेतावनी देना उत्पादक नहीं है। यदि आप इसे गलत करते हैं - आपकी अपनी गलती। वास्तव में, आपके छात्र ने ToStringडेविड एंडरसन के उत्तर में पोस्ट किए गए ओवरराइडिंग के लिए दिशानिर्देशों की आधिकारिक सूची में बिंदु 4 का उल्लंघन किया ।
कोनराड रुडोल्फ

129

मैं आपको .NET विकास श्रृंखला से फ्रेमवर्क डिज़ाइन दिशानिर्देशों से सीधे उत्तर देने जा रहा हूं ।

AVOID से अपवादों को फेंकनाToString

विचार एक अनूठा उदाहरण के साथ जुड़े स्ट्रिंग लौटने।

विचार के उत्पादन में होने ToStringइस प्रकार के कोई भी पार्सिंग तरीकों के लिए एक वैध इनपुट किया।

डीओ यह सुनिश्चित करें कि ToStringकोई नमूदार साइड इफेक्ट है।

डीओ रिपोर्ट की एक ओवरराइड के माध्यम से सुरक्षा के प्रति संवेदनशील जानकारी ToStringएक उचित अनुमति की मांग के बाद ही। यदि अनुमति की मांग विफल हो जाती है, तो सुरक्षा-संवेदनशील जानकारी को छोड़कर एक स्ट्रिंग लौटाएं।

Object.ToStringविधि सामान्य प्रदर्शन और डिबगिंग उद्देश्यों के लिए इस्तेमाल किया जा करने का इरादा है। डिफ़ॉल्ट कार्यान्वयन केवल ऑब्जेक्ट प्रकार नाम प्रदान करता है। डिफ़ॉल्ट कार्यान्वयन बहुत उपयोगी नहीं है, और यह अनुशंसा की जाती है कि विधि को ओवरराइड किया जाए।

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

डीओ एक अनूठा नहीं बल्कि पठनीय आईडी पर एक परिचित नाम पसंद करते हैं।

यह भी ध्यान देने योग्य है क्योंकि क्रिस सेल्स उन दिशानिर्देशों में भी बताते हैं जो ToStringअक्सर उपयोगकर्ता इंटरफेस के लिए खतरनाक होते हैं। आम तौर पर मेरे अंगूठे का नियम एक संपत्ति को उजागर करना है जो यूआई को बाध्यकारी जानकारी के लिए उपयोग किया जाएगा, और ToStringडेवलपर को नैदानिक ​​जानकारी प्रदर्शित करने के लिए ओवरराइड छोड़ देगा । आप अपने प्रकार के साथ भी सजा सकते हैं DebuggerDisplayAttribute

डीओ स्ट्रिंग से लौटे रखने की कोशिश ToStringकम। डिबगर ToStringडेवलपर को दिखाए जाने वाले ऑब्जेक्ट का एक पाठीय प्रतिनिधित्व प्राप्त करने के लिए उपयोग करता है। यदि स्ट्रिंग डीबगर से अधिक लंबी हो सकती है, तो डिबगिंग अनुभव बाधा है।

डीओ स्ट्रिंग जब संस्कृति पर निर्भर जानकारी लौटने वर्तमान धागा संस्कृति पर आधारित स्वरूपण।

डीओ अधिभार प्रदान ToString(string format), या लागू IFormattable, अगर से स्ट्रिंग वापसी ToStringसंस्कृति के प्रति संवेदनशील है या वहाँ स्ट्रिंग स्वरूपित करने के लिए विभिन्न तरीके हैं। उदाहरण के लिए, DateTimeअधिभार और औजार प्रदान करता है IFormattable

एक खाली स्ट्रिंग या नल से वापस न करेंToString

मैं इन दिशानिर्देशों की कसम खाता हूं, और आपको चाहिए। मैं आपको यह नहीं बता सकता कि कैसे मेरे कोड ने केवल इस एक दिशानिर्देश के द्वारा सुधार किया है ToString। एक ही चीज जैसी चीजों के लिए जाता है IEquatable(Of T)और IComparable(Of T)। ये चीजें आपके कोड को बहुत कार्यात्मक बनाती हैं, और आपको इसमें से किसी को लागू करने के लिए अतिरिक्त समय लेने का पछतावा नहीं होगा।

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


6
अच्छा जवाब, क्या ये दिशानिर्देश हैं जिनसे आप msdn.microsoft.com/en-us/library/ms229042.aspx का संदर्भ लेते हैं ?
जोडरेल

2
@ जोडरेल मेरा मानना ​​है कि यह फ्रेमवर्क डिज़ाइन दिशानिर्देशों
जिम शुबर्ट

6
बेहतर प्रशस्ति पत्र की जरूरत है।
बेन वोइग्ट

13
मुझे नहीं पता था कि SO विकिपीडिया में बदल रहा है।
डेविड एंडरसन

14
यह नहीं है, लेकिन जब आप दिशानिर्देशों को उद्धृत करते हैं, तो स्रोत प्रदान करना एक अपरिहार्य प्लस है।
Falanwe

39

अधिभावी ToString()आप एक वर्ग का एक उपयोगी मानव पठनीय स्ट्रिंग प्रतिनिधित्व देने के लिए अनुमति देता है।

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

अपने उदाहरण के संबंध में - यह बताना मुश्किल है कि क्या आपका ओवरराइड यह जानने के बिना उपयोगी है कि यह वर्ग क्या है - लेकिन कार्यान्वयन स्वयं ठीक है।


13

यह हमेशा उचित होता है लेकिन आप जो प्रदर्शित कर रहे हैं उसके पीछे के इरादों पर ध्यान से विचार करें

एक बेहतर सवाल पूछना होगा:

क्यों एक ToString () ओवरराइड करेगा?

ToString () एक ऑब्जेक्ट की स्थिति में विंडो है। आवश्यकता के रूप में राज्य पर जोर । जावा / सी जैसी मजबूत ओओपी भाषाएँ एक कक्षा में सब कुछ एनकैप करके ओओपी मॉडल का दुरुपयोग करती हैं। कल्पना कीजिए कि आप एक ऐसी भाषा में कोडिंग कर रहे हैं जो मजबूत ओओपी मॉडल का पालन नहीं करती है; विचार करें कि क्या आप कक्षा या फ़ंक्शन का उपयोग करेंगे। यदि आप इसे एक फ़ंक्शन (यानी क्रिया, क्रिया) के रूप में उपयोग करेंगे और आंतरिक स्थिति केवल इनपुट / आउटपुट के बीच अस्थायी रूप से बनाए रखी जाती है, तो ToString () मूल्य नहीं जोड़ेगा।

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

मुझे किसी ऑब्जेक्ट के --help पैरामीटर के रूप में ToString विधि की कल्पना करना पसंद है। यह छोटा, पठनीय, स्पष्ट और प्रदर्शित करने में आसान होना चाहिए। यह प्रदर्शित करना चाहिए कि वस्तु वह नहीं है जो वह करता है । उस सब को ध्यान में रखकर आइए ...

केस का उपयोग करें - एक टीसीपी पैकेट को पार्स करना:

एक अनुप्रयोग-स्तर-केवल नेटवर्क कैप्चर नहीं है, लेकिन कुछ और अधिक मांस के साथ कुछ जैसे कि एक कैप्चर कैप्चर।

आप केवल टीसीपी परत के लिए ToString () को ओवरलोड करना चाहते हैं ताकि आप कंसोल पर डेटा प्रिंट कर सकें। इसमें क्या शामिल होगा? आप पागल हो सकते हैं और सभी टीसीपी विवरण (यानी टीसीपी जटिल है) को पार्स कर सकते हैं ...

जिसमें शामिल हैं:

  • स्रोत पोर्ट
  • गंतव्य बंदरगाह
  • क्रम संख्या
  • आभार संख्या
  • डेटा ऑफसेट
  • झंडे
  • विंडो ऑफ़सेट
  • checksum
  • तत्काल सूचक
  • विकल्प (मैं वहां जाने वाला भी नहीं हूं )

लेकिन क्या आप 100 पैकेट पर TCP.ToString () कॉल कर रहे हैं, तो क्या आप वह सब प्राप्त करना चाहेंगे? बेशक, यह जानकारी अधिभार नहीं होगा। आसान और स्पष्ट विकल्प भी सबसे समझदार है ...

यह देखें कि लोग क्या देखने की उम्मीद करेंगे:

  • स्रोत पोर्ट
  • गंतव्य बंदरगाह

मैं समझदार आउटपुट पसंद करता हूं जो मनुष्यों के लिए आसान है लेकिन YMMV

TCP:[destination:000, source:000]

कुछ भी जटिल नहीं है, आउटपुट मशीनों के लिए पार्स नहीं है (अर्थात जब तक लोग आपके कोड का दुरुपयोग नहीं कर रहे हैं), उद्देश्य उद्देश्य मानव पठनीयता के लिए है।

लेकिन उस रसदार जानकारी के बारे में बाकी जो मैंने पहले बात की थी, क्या वह भी उपयोगी नहीं है? मुझे लगता है कि पहले मिल जाएगा ...


ToString () सभी समय के सबसे मूल्यवान और अप्रयुक्त तरीकों में से एक

दो कारणों से:

  1. लोग समझ नहीं पा रहे हैं कि ToString () किसके लिए है
  2. आधार 'ऑब्जेक्ट' क्लास एक और, समान रूप से महत्वपूर्ण, स्ट्रिंग विधि गायब है।

कारण 1 - ToString की उपयोगिता का दुरुपयोग न करें ():

बहुत से लोग किसी वस्तु के सरल स्ट्रिंग प्रतिनिधित्व को खींचने के लिए ToString () का उपयोग करते हैं। सी # मैनुअल भी बताता है:

.NET फ्रेमवर्क .NETस्ट्रिंग एक प्रमुख प्रारूपण विधि है। यह एक वस्तु को उसके स्ट्रिंग प्रतिनिधित्व में परिवर्तित करता है ताकि यह प्रदर्शन के लिए उपयुक्त हो।

प्रदर्शन, आगे की प्रक्रिया नहीं। इसका मतलब यह नहीं है कि ऊपर टीसीपी पैकेट का मेरा अच्छा स्ट्रिंग प्रतिनिधित्व ले लो, और regex :: cringe :: का उपयोग करके स्रोत पोर्ट को खींचें।

चीजों को करने का सही तरीका है, ToString () को सीधे SourcePort प्रॉपर्टी पर कॉल करें (जो कि BTW एक ushort है इसलिए ToString () पहले से ही उपलब्ध होना चाहिए)।

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

सौभाग्य से, ऐसी रणनीतियाँ बहुत आम हैं:

  • ISerializable (C #)
  • अचार (पायथन)
  • JSON (जावास्क्रिप्ट या कोई भी भाषा जो इसे लागू करती है)
  • साबुन
  • आदि...

नोट: जब तक आप PHP का उपयोग नहीं कर रहे हैं क्योंकि, हर्प-डीआरपी, उसके लिए एक फ़ंक्शन है :: snicker ::

कारण 2 - ToString () पर्याप्त नहीं है:

मुझे अभी तक एक ऐसी भाषा दिखाई दे रही है जो इसे मूल रूप से लागू करती है लेकिन मैंने जंगली में इस दृष्टिकोण की विविधताओं को देखा और उपयोग किया है।

जिनमें से कुछ में शामिल हैं:

  • ToVerboseString ()
  • ToString (वर्बोज़ सच =)

मूल रूप से, टीसीपी पैकेट के राज्य के बालों की गंदगी को मानव पठनीयता के लिए वर्णित किया जाना चाहिए। टीसीपी के बारे में बात करते हुए 'एक मरे हुए घोड़े की पिटाई' से बचने के लिए मैं # 1 मामले पर उंगली उठाता हूं, जहां मुझे लगता है कि ToString () और ToVerboseString () को कम किया गया है ...

केस का उपयोग करें - सारणी:

यदि आप मुख्य रूप से एक भाषा का उपयोग करते हैं, तो आप शायद उस भाषा के दृष्टिकोण के साथ सहज हैं। मेरे जैसे लोगों के लिए जो विभिन्न भाषाओं के बीच कूदते हैं, विभिन्न दृष्टिकोणों की संख्या परेशान कर सकती है।

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

कर रहे हैं विभिन्न मामलों में जहां भाषाओं आम का उपयोग हैक्स और एक कुछ है कि प्राप्त यह सही । कुछ को फिर से आविष्कार करने की आवश्यकता होती है, कुछ एक उथले डंप करते हैं, दूसरे एक गहरी डंप करते हैं, उनमें से कोई भी उस तरह से काम नहीं करता है जैसे मैं उन्हें पसंद करता हूं ...

मैं जो पूछ रहा हूं वह बहुत ही सरल तरीका है:

print(array.ToString());

आउटपुट: 'एरे [x]' या 'एरे [x] [y]'

जहां x पहले आयाम में वस्तुओं की संख्या है और y दूसरे आयाम में वस्तुओं की संख्या या कुछ मान है जो इंगित करता है कि 2 आयाम दांतेदार है (न्यूनतम / अधिकतम रेंज शायद?)।

तथा:

print(array.ToVerboseString());

सुंदर प्रिंट में पूरे शी-बैंग्स को आउटपुट करता है क्योंकि मैं सुंदर चीजों की सराहना करता हूं।

उम्मीद है, यह एक विषय पर कुछ प्रकाश डालता है जिसने मुझे लंबे समय तक परेशान किया है। बहुत कम से कम मैंने इस जवाब को कम करने के लिए PHPers के लिए थोड़ा ट्रोल-चारा छिड़का।


आपने लिखा है, "मुझे अभी तक एक ऐसी भाषा देखनी है जो इसे मूल रूप में लागू करती है"। यह मुझे लगता है कि पायथन इस के करीब आता है; उदाहरण के लिए एक सरणी को मुद्रित करने से उसका सारा डेटा संक्षिप्त रूप से प्राप्त होता है। मुझे C # / Java में एक बात याद आती है, हालांकि मुझे उनकी कठोरता पसंद है। और जब आपको ToString () से परे एक टैड जाने की आवश्यकता होती है, तो पायथन की सूची समझने वाले वाक्यविन्यास जैसा कुछ होना अच्छा होगा; मुझे लगता है कि स्ट्रिंग। जॉइन () समान है, हालांकि कम लचीला है।
जॉन कॉम्ब्स

1
@ JCbs मैं असहमत नहीं हैं, समझ महान हैं। समझ के माध्यम से पायथन में डेटा संरचनाओं को ट्रैवर्स करना जीवन को बहुत आसान बनाता है लेकिन उस दृष्टिकोण को अभी भी ऑब्जेक्ट की आंतरिक संरचना के अंतरंग ज्ञान की आवश्यकता होती है। बाहरी पुस्तकालय से आयात किए गए वर्गों के साथ कुछ हमेशा स्पष्ट नहीं होता है। लाइब्रेरी लेखकों के लिए ToString को ओवरराइड करना () और एक उपयोगी मानव-पठनीय प्रतिनिधित्व प्रदान करना अच्छा है, लेकिन एक सामान्य डंप विधि होना भी अच्छा होगा जो ऑब्जेक्ट की संरचना को सामान्य संरचित मानव पठनीय प्रारूप (पूर्व JSON) में आउटपुट करता है।
इवान प्लाइस

उत्कृष्ट बिंदु। इसलिए मूल रूप से एक टाइपोफ से अधिक कुछ नहीं दिखाने के बजाय, यह JSON जैसी किसी चीज़ को ऑटो-सीरियल कर सकता है। (अब तक, मैंने केवल .NET ऑब्जेक्ट्स को एक्सएमएल पर क्रमबद्ध देखा है, लेकिन मैं .NET के लिए नया हूं) लेकिन फिर मशीन-पठनीय के रूप में टोस्टरिंग () के इलाज के लिए खतरा हो सकता है? (जैसे कि उम्मीद की जा सकती है कि यह इसे निष्क्रिय कर सकेगा।)
जॉन कॉम्ब्स

1
@JCbsbs हां, एक कार्यात्मक स्तर पर JSON और XML एक ही उद्देश्य पर काम करते हैं। बहुत से लोग ToString का उपयोग मशीन-पठनीय आउटपुट के रूप में करते हैं; बुरा है या नहीं यह बहस का मुद्दा है। मेरा सबसे बड़ा गोमांस है - अक्सर बार - यह एक मानव-पठनीय प्रारूप में एक वस्तु की स्थिति का उत्पादन करने के लिए एक दर्द है। ToString () कार्यान्वयन अक्सर अंडर-उपयोग किया जाता है और डीबगर घड़ी सूचियों के बाहर किसी वस्तु की स्थिति को पढ़ना एक दर्द है। पूरे राज्य को प्रदर्शित करने के लिए एक बैकअप के रूप में सीरियलाइज्ड अभ्यावेदन अच्छे हैं, लेकिन ToString का बेहतर कार्यान्वयन सबसे अच्छा विकल्प है।
इवान प्लाइस

यदि ToString()डिबगिंग के लिए अभिप्रेत है, तो एक स्ट्रिंगिंगब्यूलर से पूरे पाठ को निकालने का एकमात्र तरीका क्यों है - एक महत्वपूर्ण कार्य?
दान डब्ल्यू

9

यह अच्छे अभ्यास के बारे में जितना कुछ भी है, वास्तव में है।

ToString()कई स्थानों पर एक वस्तु का एक स्ट्रिंग प्रतिनिधित्व वापस करने के लिए उपयोग किया जाता है, आम तौर पर मानव द्वारा खपत के लिए। अक्सर उसी स्ट्रिंग का उपयोग वस्तु को पुनर्व्यवस्थित करने के लिए किया जा सकता है ( उदाहरण के लिए intया DateTimeउदाहरण के लिए), लेकिन यह हमेशा एक दिया नहीं जाता है (उदाहरण के लिए एक पेड़, एक उपयोगी स्ट्रिंग प्रतिनिधित्व हो सकता है जो बस एक गणना प्रदर्शित करता है, लेकिन स्पष्ट रूप से आप उपयोग नहीं कर सकते हैं कि इसे पुनर्निर्माण करने के लिए)।

विशेष रूप से डीबगर इसका उपयोग घड़ी की खिड़कियों, तत्काल खिड़कियों आदि में चर को प्रदर्शित करने के लिए करेगा, इसलिए ToStringवास्तव में डीबगिंग के लिए अमूल्य है।

सामान्य तौर पर, इस तरह के, अक्सर एक स्पष्ट सदस्य होता है जो एक स्ट्रिंग भी लौटाता है। उदाहरण के लिए एक लाट / लंबी जोड़ी हो सकती है ToDecimalDegreesजो "-10, 50"उदाहरण के लिए वापस आती है, लेकिन यह भी हो सकती है ToDegreesMinutesSeconds, क्योंकि यह एक लात / लंबी जोड़ी के लिए एक और प्रारूप है। उसी प्रकार यह ToStringडिबगिंग जैसी चीजों के लिए 'डिफ़ॉल्ट' प्रदान करने के लिए या वेब पेजों को रेंडर करने जैसी चीजों के लिए संभावित रूप से भी ओवरराइड कर सकता है (उदाहरण के लिए, @रेजर में निर्माण ToString()गैर-स्ट्रिंग अभिव्यक्ति का परिणाम लिखता है। आउटपुट स्ट्रीम)।


6

object.ToString()एक वस्तु को उसके स्ट्रिंग प्रतिनिधित्व में परिवर्तित करता है। यदि आप बदलना चाहते हैं कि जब कोई उपयोगकर्ता ToString()आपके द्वारा बनाए गए वर्ग पर कॉल करता है, तो आपको ToString()उस कक्षा में ओवरराइड करना होगा ।


6

जबकि मुझे लगता है कि सबसे उपयोगी जानकारी पहले ही प्रदान की जा चुकी है, मैं अपने दो सेंट जोड़ूंगा:

  • ToString()ओवरराइड करने का मतलब है। इसका डिफ़ॉल्ट कार्यान्वयन उस प्रकार के नाम को लौटाता है, जो कई बार उपयोगी होता है (विशेषकर तब जब बहुत सारी वस्तुओं के साथ काम करते हुए), यह समय के बड़े हिस्से में पर्याप्त नहीं होता है।

  • याद रखें कि, डिबगिंग उद्देश्यों के लिए, आप पर भरोसा कर सकते हैं DebuggerDisplayAttribute। आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं ।

  • एक नियम के रूप में, POCOs पर आप हमेशा ओवरराइड कर सकते हैं ToString()। POCO डेटा का एक संरचित प्रतिनिधित्व है, जो आमतौर पर एक स्ट्रिंग बन सकता है।

  • डिजाइन ToString अपनी वस्तु का एक पाठीय प्रतिनिधित्व करने के लिए। शायद इसके मुख्य क्षेत्र और डेटा, शायद संग्रह में कितने आइटम हैं, आदि का वर्णन।

  • हमेशा उस स्ट्रिंग को एक पंक्ति में फिट करने का प्रयास करें और केवल आवश्यक जानकारी हो। यदि आपके पास Personनाम, पता, संख्या आदि गुणों के साथ एक वर्ग है, तो केवल मुख्य डेटा लौटाएं (कुछ आईडी नंबर का नाम)।

  • के एक अच्छे कार्यान्वयन को ओवरराइड नहीं करने के लिए सावधान रहें ToString()। कुछ फ्रेमवर्क कक्षाएं पहले से ही लागू हैं ToString()। डिफ़ॉल्ट कार्यान्वयन को ओवरराइड करना एक बुरी बात है: लोग एक निश्चित परिणाम की अपेक्षा करेंगे ToString()और दूसरे को प्राप्त करेंगे।

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


5

यदि आप ओवरराइड नहीं करते हैं, ToStringतो आपको अपने बेस क्लासेस का कार्यान्वयन मिल Objectजाता है , जो कि क्लास का केवल छोटा प्रकार का नाम है।

यदि आप कुछ अन्य, अधिक सार्थक या उपयोगी कार्यान्वयन चाहते हैं, ToStringतो इसे ओवरराइड करें।


यह आपके प्रकार की सूची का उपयोग करते समय उपयोगी हो सकता है ListBoxक्योंकि ToStringवसीयत के लिए डेटा स्रोत के रूप में स्वचालित रूप से प्रदर्शित किया जाएगा।

जब आप अपने प्रकार को पास करना चाहते हैं, तो एक और सीटूटेशन होता है, String.Formatजो आपके प्रकार का ToStringप्रतिनिधित्व पाने के लिए आह्वान करता है।


4

कुछ और जो किसी ने अभी तक उल्लेख नहीं किया है: ओवरराइड करके ToString(), आप इसे लागू करने पर भी विचार IFormattableकर सकते हैं ताकि आप निम्नलिखित कार्य कर सकें:

 public override ToString() {
   return string.Format("{0,-20} {1, -20}", m_work, m_personal);
 }

 public ToString(string formatter) {
   string formattedEmail = this.ToString();
   switch (formatter.ToLower()) {
     case "w":
       formattedEmail = m_Work;
       break;
     case "p":
       formattedEmail = m_Personal;
       break;
     case "hw":
       formattedEmail = string.Format("mailto:{0}", m_Work);
       break;
   }
   return formattedEmail;
}

जो उपयोगी हो सकता है।


क्या आप कृपया उस विधि को ओवरराइड करने के लिए एक फ्रेमवर्क वर्ग का उदाहरण दे सकते हैं? केवल संबंधित सामान जो मुझे फ्रेमवर्क में पता है वह IFormattibleइंटरफ़ेस है।
tm1

@ tm1 जिस किसी भी ऑब्जेक्ट से विरासत में मिला है, System.Objectवह एक शानदार ToString()तरीका होगा, लेकिन आप सही हैं कि फ़ॉर्मेटर विधि नहीं होनी चाहिए overrideऔर वास्तव में IFormattibleपूर्ण अनुरूपता के लिए इंटरफ़ेस को संदर्भित करना चाहिए ।
ज़ाफ - बेन ड्यूगिड

लगभग - IFormattableएक IFormatProviderपैरामीटर लेता है । यद्यपि अपनी पोस्ट को संपादित करने के लिए धन्यवाद।
tm1

वास्तव में, इसकी दो विधियां हैं, जो मूल्य मैं व्यक्त कर रहा था वह एक दिखाया गया था;)
झाफ - बेन डुगिड


2

कुछ मामलों में डिबगर वॉच विंडो में कस्टम कक्षाओं के मूल्यों को पढ़ना आसान हो जाता है। अगर मुझे पता है कि मैं घड़ी की खिड़की में क्या देखना चाहता हूं, जब मैं उस जानकारी के साथ ToString को ओवरराइड करता हूं, तो मैं इसे देखता हूं।


1

जब संरचना को परिभाषित करना (प्रभावी रूप से उपयोगकर्ता-आदिम) मुझे लगता है कि मिलान ToString, ParseऔरTryParse तरीकों, विशेष रूप से एक्सएमएल क्रमबद्धता के लिए। इस स्थिति में आप पूरे राज्य को एक स्ट्रिंग में परिवर्तित कर देंगे, ताकि बाद में इसे पढ़ा जा सके।

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

इसके अलावा, जैसा कि रोबी ने कहा, ओवरराइडिंग ToStringआपको ToStringसंदर्भ के रूप में बुनियादी के रूप में कॉल करने की अनुमति देता है object


1

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


1

Object.ToStringविधि केवल डीबगिंग उद्देश्यों के लिए इस्तेमाल किया जाना चाहिए। डिफ़ॉल्ट कार्यान्वयन ऑब्जेक्ट प्रकार नाम दिखाता है जो बहुत उपयोगी नहीं है। निदान और डिबगिंग के लिए बेहतर जानकारी प्रदान करने के लिए इस पद्धति को ओवरराइड करने पर विचार करें। कृपया विचार करें कि लॉगिंग इन्फ्रास्ट्रक्चर अक्सर ToString पद्धति का उपयोग करते हैं और इसलिए आपको ये पाठ टुकड़े आपकी लॉग फ़ाइलों में मिलेंगे।

Object.ToStringविधि के भीतर स्थानीयकृत पाठ संसाधन वापस न करें । कारण यह है कि ToString विधि को हमेशा कुछ ऐसा लौटना चाहिए जिसे डेवलपर समझ सके। डेवलपर उन सभी भाषाओं को नहीं बोल सकता है जो अनुप्रयोग का समर्थन करता है।

लागूIFormattable इंटरफ़ेस जब आप एक उपयोगकर्ता के अनुकूल स्थानीयकृत लेख वापस जाने के लिए चाहते हैं। यह इंटरफ़ेस मापदंडों के साथ एक ToString अधिभार को परिभाषित करता है formatऔर formatProvider। FormatProvider आपको पाठ को संस्कृति के प्रति जागरूक तरीके से प्रारूपित करने में मदद करता है।

इसे भी देखें: Object.ToString और IFormattable


0

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

हालांकि, ऐसा प्रतीत होता है कि आप अपनी संपत्ति के सामान्य स्ट्रिंग डेटा को वापस नहीं करने के लिए, लेकिन एक मानक स्वरूपण पैटर्न करने के लिए ToString विधि को ओवरराइड कर रहे हैं। चूंकि आप पैडिंग के साथ string.format का उपयोग कर रहे हैं।

चूँकि आपने कहा था कि आप सीख रहे हैं, इसलिए एनकैप्सुलेशन और कोड री-यूज़ से संबंधित ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में मुख्य सिद्धांतों पर भी जोर पड़ता है।

पैडिंग के लिए आपके द्वारा तय किए गए तर्कों को लेने वाली स्ट्रिंग यह सुनिश्चित करती है कि संपत्ति को हर बार उसी तरह से स्वरूपित किया जाएगा जो किसी भी कोड को कॉल करता है। साथ ही, आपको आगे जाकर केवल कई के बजाय इसे एक स्थान पर बदलना होगा।

बढ़िया सवाल और कुछ बेहतरीन जवाब भी!


0

मैं इकाई वर्गों पर ToString विधि को ओवरराइड करने के लिए उपयोगी पाता हूं क्योंकि यह परीक्षण में मुद्दों को जल्दी से पहचानने में मदद करता है, खासकर जब एक परीक्षण विफल हो जाता है तो परीक्षण कंसोल ऑब्जेक्ट पर ToString विधि को लागू करेगा।

लेकिन इससे पहले कि यह कहा गया है कि प्रश्न में वस्तु का मानव पठनीय प्रतिनिधित्व देने के लिए क्या कहा गया है।


0

मैं अन्य उत्तरों में उल्लिखित फ्रेमवर्क दिशानिर्देशों से खुश हूं। हालाँकि, मैं प्रदर्शन और डिबगिंग के उद्देश्यों पर ज़ोर देना चाहूँगा।

इस बात से सावधान रहें कि आप ToStringअपने कोड में कैसे उपयोग करते हैं। आपका कोड किसी ऑब्जेक्ट के स्ट्रिंग प्रतिनिधित्व पर निर्भर नहीं होना चाहिए। यदि ऐसा होता है, तो आपको संबंधित Parseतरीके प्रदान करने चाहिए ।

चूँकि ToStringहर जगह इसका उपयोग किया जा सकता है, यदि आप बाद में किसी समय पर किसी वस्तु के स्ट्रिंग प्रतिनिधित्व को बदलना चाहते हैं, तो यह एक स्थायित्व बनाए रखने वाला बिंदु हो सकता है। आप इस मामले में कॉल पदानुक्रम की जांच नहीं कर सकते हैं कि क्या कुछ कोड टूट जाएगा।

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