ToString प्रयोग
नहीं, आपको ToStringयहां उपयोग नहीं करना चाहिए ।
स्ट्रिंग संघनन स्वचालित रूप से गैर-तार को तार में बदल देता है, जिसका अर्थ है कि आपके दो संस्करण लगभग समान हैं:
जब एक या दोनों ऑपरेंड टाइप स्ट्रिंग के होते हैं, तो पूर्वनिर्धारित परिवर्धन ऑपरेटर ऑपरेंड्स के स्ट्रिंग प्रतिनिधित्व को बदलते हैं।
स्रोत: सी # भाषा विशिष्टता: अतिरिक्त ऑपरेटर, MSDN ।
दूसरी ओर, पहला वाला (बिना ToString):
- लिखने के लिए छोटा है,
- पढ़ने के लिए कम है,
- बनाए रखना आसान है और:
- लेखक के इरादे को बिल्कुल दिखाता है: तार को समतल करना।
इसलिए पहले वाले को प्राथमिकता दें।
हुड के नीचे
यह देखना भी दिलचस्प है कि हुड के नीचे क्या होता है। यह देखने का एक तरीका यह है कि LINQPad के भीतर आईएल कोड देखना है। यह कार्यक्रम:
void Main()
{
var a = 3;
var b = " Hello";
var c = a + b;
Console.WriteLine(c);
}
निम्नलिखित IL में अनुवादित है:
IL_0001: ldc.i4.3
IL_0002: stloc.0 // a
IL_0003: ldstr " Hello"
IL_0008: stloc.1 // b
IL_0009: ldloc.0 // a
IL_000A: box System.Int32
IL_000F: ldloc.1 // b
IL_0010: call System.String.Concat
IL_0015: stloc.2 // c
IL_0016: ldloc.2 // c
IL_0017: call System.Console.WriteLine
वह देखें System.String.Concat? इसका मतलब है कि मूल कोड को भी उसी तरह लिखा जा सकता है, जो बिल्कुल उसी आईएल में अनुवाद करता है:
void Main()
{
var a = 3;
var b = " Hello";
var c = string.Concat(a, b); // This is the line which was changed.
Console.WriteLine(c);
}
जब आप इसके दस्तावेज कोstring.Concat(object[]) पढ़ते हैं , तो आप सीख सकते हैं कि:
विधि उस वस्तु के पैरामीटर रहित तरीके को कॉल करके प्रत्येक वस्तु को आर्गन्स में समेटती है ToString; यह किसी भी सीमांकक को नहीं जोड़ता है।
इसका मतलब है कि ToStringबेमानी है। इसके अलावा:
String.Empty सरणी में किसी भी अशक्त वस्तु के स्थान पर उपयोग किया जाता है।
जो अच्छी तरह से मामले को संभालता है जहां कुछ ऑपरेंड अशक्त हैं (फुटनोट देखें 1)।
अंतिम उदाहरण में, संघनन में अनुवाद किया गया था string.Concat, एक को संकलक अनुकूलन को भी उजागर करना चाहिए:
var a = "Hello " + "World";
में अनुवादित है:
ldstr "Hello World"
stloc.0
दूसरी ओर:
var a = string.Concat("Hello ", "World");
में अनुवादित है:
ldstr "Hello "
ldstr "World"
call System.String.Concat
stloc.0
अन्य विकल्प
C # में वस्तुओं के स्ट्रिंग निरूपण को निश्चित करने के अन्य तरीके हैं।
StringBuilderका उपयोग तब किया जाता है जब आपको बहुत अधिक संचालन संचालन करने की आवश्यकता होती है और बनाए गए मध्यस्थ तारों की संख्या को कम करने में मदद करता है। यह तय करना कि आपको StringBuilderया एक साधारण समागम का उपयोग करना चाहिए, क्या यह आसान नहीं है। स्टैक ओवरफ्लो पर प्रासंगिक उत्तरों के लिए एक प्रोफाइलर का उपयोग करें या खोजें।
का उपयोग StringBuilderकर कोड को पढ़ने और बनाए रखने के लिए मुश्किल बनाने की एक बड़ी खामी है। आपके प्रश्न के रूप में सरल मामलों के लिए, StringBuilderन केवल कोड की पठनीयता के लिए हानिकारक है, बल्कि प्रदर्शन के मामले में भी बेकार है।
string.Join जब आपको सीमांकक जोड़ने की आवश्यकता हो तब इसका उपयोग किया जाना चाहिए।
जाहिर है, string.Joinएक खाली सीमांकक के साथ तार का उपयोग करने के लिए कभी नहीं ।
string.Formatतब इस्तेमाल किया जा सकता है जब स्ट्रिंग टेंपलेटिंग को स्ट्रिंग संघनन के लिए पसंद किया जाता है। उन मामलों में से एक जहां आप पसंद कर सकते हैं कि जब संदेश को स्थानीयकृत किया जा सकता है, जैसा कि कुंथेट द्वारा उत्तर में दिया गया है।
उपयोग string.Formatमें कई कमियां हैं जो इसे आपके जैसे सरल मामलों के लिए अनुपयुक्त बना देता है:
सरल "{0}" प्लेसहोल्डर्स के साथ, यह अक्सर स्पष्ट नहीं होता है कि कौन सा पैरामीटर कहाँ जाता है। यह अक्सर गलती से मापदंडों को उलटने या एक को भूल जाने के लिए होता है। सौभाग्य से, सी # 6 अंत में स्ट्रिंग प्रक्षेप का परिचय देता है जो इस समस्या को हल करता है।
रनटाइम प्रदर्शन में गिरावट आ सकती है। बेशक, यह मत समझो कि string.Formatयह हमेशा धीमा है। यदि प्रदर्शन मायने रखता है, तो दो दृष्टिकोणों को मापें और निर्धारित करें कि कौन सी मान्यताओं के बजाय आपके वास्तविक परिणामों के आधार पर तेज है।
कोड लिखने के लिए थोड़ा लंबा है, पढ़ने के लिए लंबा है और बनाए रखने के लिए कठिन है, हालांकि यह बेहद मामूली है और आपको बहुत परेशान नहीं करना चाहिए।
Of वस्तुओं में से एक होने पर अंतर प्रकट होता है null। बिना ToString, एक nullखाली स्ट्रिंग द्वारा प्रतिस्थापित किया जाता है। के साथ ToString, एक NullReferenceExceptionफेंक दिया है।
a + "" + b + ""या"" + a + b + "", यह कोई बात नहीं: यह सब स्ट्रिंग संयोजन है। इसमेंa + b + ""कोई फर्क नहीं पड़ता:aऔरbपहले जोड़े जाते हैं।