क्या मुझे .TStString () का उपयोग करना चाहिए जब C # में स्ट्रिंग और पूर्णांक चर समतल करते हैं?


19
int a = 1;
int b = 2;
int sum = a + b;
string expression = "Expression: " + a + " + " + b + " = " + sum;
Console.WriteLine(expression); //displays Expression 1 + 2 = 3

क्या मुझे उपयोग करना चाहिए:

string expression = "Expression: " + a + " + " + b + " = " + sum;

या

string expression = "Expression: " + a.ToString() + " + " + b.ToString() + " = " + result.ToString();

क्या इसका उपयोग करने की सिफारिश की जाती है ToString()जब समवर्ती stringऔर int?


6
में a + "" + b + ""या "" + a + b + "", यह कोई बात नहीं: यह सब स्ट्रिंग संयोजन है। इसमें a + b + ""कोई फर्क नहीं पड़ता: aऔर bपहले जोड़े जाते हैं।
टिम एस।

4
साइड नोट: VB.NET में, इस अस्पष्टता को एक स्पष्ट स्ट्रिंग संघनन ऑपरेटर होने से बचा जाता है : "Expression: " + aएक संकलन समय त्रुटि (विकल्प स्टिक ऑन के साथ) फेंक "Expression: " & aदेगा , स्ट्रिंग संयोजन का प्रदर्शन करेगा।
हेइन्ज़ी

पहले कोड का परिणाम मुक्केबाजी में होगा (int32 से int), दूसरा नहीं। दूसरा स्पष्ट रूप से तेज है।
रैंडम अल्फाबेट्स

जवाबों:


33

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 # में वस्तुओं के स्ट्रिंग निरूपण को निश्चित करने के अन्य तरीके हैं।

  1. StringBuilderका उपयोग तब किया जाता है जब आपको बहुत अधिक संचालन संचालन करने की आवश्यकता होती है और बनाए गए मध्यस्थ तारों की संख्या को कम करने में मदद करता है। यह तय करना कि आपको StringBuilderया एक साधारण समागम का उपयोग करना चाहिए, क्या यह आसान नहीं है। स्टैक ओवरफ्लो पर प्रासंगिक उत्तरों के लिए एक प्रोफाइलर का उपयोग करें या खोजें।

    का उपयोग StringBuilderकर कोड को पढ़ने और बनाए रखने के लिए मुश्किल बनाने की एक बड़ी खामी है। आपके प्रश्न के रूप में सरल मामलों के लिए, StringBuilderन केवल कोड की पठनीयता के लिए हानिकारक है, बल्कि प्रदर्शन के मामले में भी बेकार है।

  2. string.Join जब आपको सीमांकक जोड़ने की आवश्यकता हो तब इसका उपयोग किया जाना चाहिए।

    जाहिर है, string.Joinएक खाली सीमांकक के साथ तार का उपयोग करने के लिए कभी नहीं ।

  3. string.Formatतब इस्तेमाल किया जा सकता है जब स्ट्रिंग टेंपलेटिंग को स्ट्रिंग संघनन के लिए पसंद किया जाता है। उन मामलों में से एक जहां आप पसंद कर सकते हैं कि जब संदेश को स्थानीयकृत किया जा सकता है, जैसा कि कुंथेट द्वारा उत्तर में दिया गया है।

    उपयोग string.Formatमें कई कमियां हैं जो इसे आपके जैसे सरल मामलों के लिए अनुपयुक्त बना देता है:

    • सरल "{0}" प्लेसहोल्डर्स के साथ, यह अक्सर स्पष्ट नहीं होता है कि कौन सा पैरामीटर कहाँ जाता है। यह अक्सर गलती से मापदंडों को उलटने या एक को भूल जाने के लिए होता है। सौभाग्य से, सी # 6 अंत में स्ट्रिंग प्रक्षेप का परिचय देता है जो इस समस्या को हल करता है।

    • रनटाइम प्रदर्शन में गिरावट आ सकती है। बेशक, यह मत समझो कि string.Formatयह हमेशा धीमा है। यदि प्रदर्शन मायने रखता है, तो दो दृष्टिकोणों को मापें और निर्धारित करें कि कौन सी मान्यताओं के बजाय आपके वास्तविक परिणामों के आधार पर तेज है।

    • कोड लिखने के लिए थोड़ा लंबा है, पढ़ने के लिए लंबा है और बनाए रखने के लिए कठिन है, हालांकि यह बेहद मामूली है और आपको बहुत परेशान नहीं करना चाहिए।


Of वस्तुओं में से एक होने पर अंतर प्रकट होता है null। बिना ToString, एक nullखाली स्ट्रिंग द्वारा प्रतिस्थापित किया जाता है। के साथ ToString, एक NullReferenceExceptionफेंक दिया है।


1
वास्तव में इस कारण (अप्रत्याशित व्यवहार) के लिए, +अधिकांश भाषाओं में संगति को गलत व्यवहार माना जाता है। इस मामले में, मैं उपयोग करूँगा string.Concat, कई मामलों string.Formatमें बेहतर है। यह निश्चित रूप से उपयोग करने के लिए पाइथोनिक नहीं है +, और चूंकि पीईपी 3101 %को हतोत्साहित किया गया है और साथ ही इसके पक्ष में है str.format
अरदा इलेवन

2
क्या nullवास्तव में "इसे अच्छी तरह से संभालना" के लिए एक खाली स्ट्रिंग प्रतिस्थापित कर रहा है ? खैर, यह "के रूप में त्रुटि फिर से शुरू पर" के रूप में बुरा नहीं है ...
Deduplicator

हुड के तहत, यदि आप कॉल किए बिना समवर्ती करते हैं। तोस्ट्रिंग (), मुक्केबाजी होगी ... और Concat(object[])इसके बजाय इसका उपयोग किया जाएगा Concat(string[])। तो "string " + iवास्तव में समान नहीं है"string " + i.ToString()
यादृच्छिक अक्षर

@RandomAlphabets: मान्य बिंदु। हालाँकि, अंतर केवल स्थान का है ToString(): एक मामले में ओपी कोड, System.String.Concatदूसरे मामले में कार्यान्वयन। तो, जवाब मान्य रहता है: वह कोड न लिखें जिसका कोई लाभ न हो।
आर्सेनी मॉर्ज़ेन्को

15

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

string expression = string.Format("Expression: {0} + {1} = {2}", a, b, sum);

MSDN पर अधिक जानकारी ।

हालाँकि, स्ट्रिंग संघटन स्ट्रिंग संघनन की तुलना में कम पठनीय (और शायद प्रदर्शन भी) है।


6
यह समझाने के लिए कि यह विकल्प बेहतर क्यों है?
वर्ल्ड इंजीनियर

@WorldEngineer: मैंने स्पष्टीकरण को अपडेट किया।
कुंथेट

12
मैं हर किसी के बारे में नहीं जानता, लेकिन मुझे वास्तव में यह अधिक पठनीय लगता है। शायद इसलिए कि मैं सी के साथ बड़ा हुआ, जहां इस तरह के कोड के लिए एस [एन] प्रिंटफ एकमात्र यथार्थवादी विकल्प है।
जूल्स

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

2
बस में झंकार करना चाहते हैं और आपको C # 6 में आने वाले स्ट्रिंग इंटरपोलेशन फ़ीचर के बारे में बताते हैं। आप एक ही परिणाम प्राप्त करने के लिए "अभिव्यक्ति: \ {a} + \ {b} = \ {sum}" लिखेंगे। codeproject.com/Articles/846566/...
cwap

-2

यदि आप +संघनन का उपयोग करते हैं , तो यह स्वयं String.Concatविधि का उपयोग करता है। स्ट्रिंग केवल एक ऑपरेटर को उजागर नहीं करता है।

उदाहरण के लिए:

int i = 10;
string str = "hello" + i;

इसमें संकलित है:

int i = 10;
object o1 = "hello";
object o2 = i; // Note boxing
string str = string.Concat(o1, o2);

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


2
यह केवल पूर्व में किए गए दोहराए गए बिंदुओं और समझाया गया लगता है : "स्ट्रिंग संघनन स्वचालित रूप से गैर-तार को तारों में बदल देता है ..."
gnat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.