c# क्या toString() केवल डिबगिंग के लिए उपयोगी है?




java (11)

के लिए उपयोगी

  1. गुई (कॉम्प्लेक्स प्रॉपर्टी जब आप प्रॉपर्टीग्रिड, फॉर्म हेडर टेक्स्ट का उपयोग करते हैं)
  2. डाटाबाइंडिंग (जिस तरह से यह काम कर रहा है)

और कोई अन्य स्ट्रिंग आउटपुट

बेशक, प्राथमिकताओं के साथ उनका उपयोग मैं देख रहा हूँ कि कार्यान्वयन के अधिकांश (यदि सभी नहीं) केवल प्रोग्रामर दृष्टिकोण से उपयोगी होते हैं I

संपादित करें : मैं समझता हूं कि मुझे डिफ़ॉल्ट व्यवहार को ओवरराइड करना है, इसलिए मैंने कार्यान्वयन का उल्लेख किया है :) और मुझे कुछ घटकों में इसे ओवरराइड करने का मान मिलता है, जिसमें एक GUI के अंदर स्ट्रिंग प्रस्तुति की आवश्यकता होती है। हालांकि, कम से कम जेडीके में, मैं बहुत सारे कार्यान्वयन देखता हूं, जब भी आपको ऑब्जेक्ट के उदाहरणों को डीबग करने की आवश्यकता होती है।

यह ऑब्जेक्ट क्लास में क्यों निहित है, क्योंकि यह केवल GUI / debugging सामान के लिए उपयोगी है? क्या अन्य उपयोगों का मुझे पता नहीं है?



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

मेरे अपने अवलोकन में (मैं दोनों रोज़ का उपयोग करता हूं), सी # में प्रोग्रामर को एक उपयोगी पाठ्य प्रतिनिधित्व प्रदर्शित करने के लिए "टूस्ट्रिंग" को ओवरराइड करने के लिए प्रोत्साहित किया जाता है। जबकि, जावा में, मुझे यह लगभग उतना ही नहीं दिख रहा है वास्तव में, मैं शायद ही कभी इसे देखता हूं।

-JP


मेरी व्यक्तिगत वरीयता यह है कि डीबगिंग के अलावा किसी अन्य चीज़ के लिए स्ट्रिंग () को कभी भी प्रयोग नहीं करना चाहिए यदि आप किसी ऑब्जेक्ट के लिए एक स्ट्रिंग तैयार करना चाहते हैं, तो एक अलग विधि प्रदान करें जो स्पष्ट रूप से आपके इरादे (getName (), getDescription (), इत्यादि) को दर्शाती है। एक toString () के कार्यान्वयन पर कभी भी निर्भर नहीं रहें

समस्या यह है कि कई डेवलपर स्ट्रिंग () को डीबग-स्तरीय स्ट्रिंग के रूप में देखते हैं और इसे बदलने के कुछ भी नहीं सोचते हैं (कहें कि जब नए फ़ील्ड जोड़े जाते हैं या हटाए जाते हैं)। हेक, कुछ स्वचालित toString () बिल्डर्स फ़ील्ड से एक toString () उत्पन्न करने के लिए प्रतिबिंब का उपयोग करते हैं

मैंने पाया है कि इस वरीयता ने मुझे वर्षों से अच्छी तरह से सेवा की है।


toString () उपयोगी है जब भी आप एक ऑब्जेक्ट का स्ट्रिंग प्रतिनिधित्व चाहते हैं। स्वाभाविक रूप से डिबगिंग प्रयोजनों के लिए होता है, लेकिन यह उपयोगकर्ता के लिए संचालन के परिणाम के लिए भी वैध हो सकता है।

उदाहरण के लिए, मान लें कि आपके पास एक जटिल वर्ग है जो जटिल संख्याओं को संभालता है यदि आप किसी उपयोगकर्ता को 3 + 2i जैसे प्रारूप में प्रिंट करना चाहते हैं, तो यह आसान है यदि वे स्ट्रिंग () को परिभाषित करते हैं, क्योंकि आपको हर बार प्रारूप लिखना नहीं पड़ता है और आउटपुट संगत होगा। यदि आप कभी भी उस प्रतिनिधित्व को बदलना चाहते हैं, उदाहरण के लिए 3 + 2 जे में , आपको कॉम्प्लेक्स क्लास में स्ट्रिंग () विधि को छूने की आवश्यकता है।

तो toString () डिबगिंग प्रयोजनों के लिए भी नहीं है, लेकिन आपके ऑब्जेक्ट के लगातार स्ट्रिंग अभिसरण पाने का एक अच्छा तरीका है।


एक तरफ जो पहले से ही कह चुका है, टूस्ट्रिंग () को ओवरराइड करते हुए भी उपयोगी होते हैं, जो कि इसे कॉल करते हैं। उदाहरण के लिए, एक कॉम्बो बॉक्स:

myComboBox.Items.Add(new MyClass());
// now, whatever ToString() returns is shown in the
// ComboBox, but you can get the object back by through
// the SlectedItem property.

यह "इंटेन्ट" उपयोग नहीं हो सकता, लेकिन मैंने इसे डेटा सीरियलाइजेशन के लिए उपयोग किया है

storeToHardDrive(studentList.ToString());

सबसे पहले, toString विधि को ऑब्जेक्ट के मानव-वाचनीय पाठ प्रतिनिधित्व देना चाहिए।

इस समस्या को प्रभावी जावा में लाया गया है जैसा कि आइटम 10: हमेशा toString ओवरराइड करें

यह Object.toString विधि के लिए जावा एपीआई विशिष्टता का संदर्भ देता है:

परिणाम एक संक्षिप्त लेकिन जानकारीपूर्ण प्रतिनिधित्व होना चाहिए जो किसी व्यक्ति को पढ़ने के लिए आसान है।

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

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

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


मैं सिर्फ इतना कह सकता हूं कि जब मैंने अपनी कक्षा के स्ट्रिंग को कुछ अतिरिक्त डिबग जानकारी प्रदर्शित करने के लिए बदल दिया तो मुझे कोड ब्रेक मिला।

प्रश्न में कोड एक जीयूआई लाइब्रेरी था जो स्ट्रिंग के मूल्य को कुछ आंतरिक चीज़ के रूप में इस्तेमाल करने का निर्णय लिया (यह कुछ साल पहले था ... मैं भूल गया कि यह वास्तव में क्या था)। अंतिम परिणाम यह था कि मैंने अब उस पुस्तकालय का उपयोग नहीं किया है

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

यदि आप टूस्ट्रिंग विधियों के नियंत्रण में 100% हैं तो सभी तरीकों से आप क्या चाहते हैं

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


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

एक और बिंदु मैं दृढ़ता से बनाने के लिए करना चाहते हैं अपने toString () में अन्य विधियों को कॉल न करें। डीबगर में ब्रेकपॉइंट पर चर सामग्री की जांच करने से और कुछ और भी बुरा नहीं है, और फिर स्ट्रिंग () में विधि कॉल के कारण अधिक कोड निष्पादित होता है।


AS3 पर, मुझे 2 डी सरणी को 1 डी सरणी में कनवर्ट करना पड़ा। सबसे तेज़ (रन की गति) और आसान (कोडिंग समय) समाधान था:

var new1DArray:Array = the2DArray.toString().split(",");

हैरान रहो, लेकिन यह वास्तव में इरादा और बहुत तेजी से भी काम कर रहा है!





tostring