स्ट्रिंग इंटरपोलेशन बनाम स्ट्रिंग ।फॉर्मैट


113

क्या स्ट्रिंग प्रक्षेप का उपयोग करने के बीच एक उल्लेखनीय प्रदर्शन अंतर है:

myString += $"{x:x2}";

बनाम स्ट्रिंग.फॉर्मेट ()?

myString += String.Format("{0:x2}", x);

मैं केवल इसलिए पूछ रहा हूं क्योंकि रेस्पर ठीक करने का संकेत दे रहा है, और मुझे पहले बेवकूफ बनाया गया है।


4
दोनों की कोशिश क्यों न करें और देखें कि क्या आप अंतर नोटिस करते हैं?
Blorgbeard

57
@Blorgbeard ईमानदारी से, मैं आलसी हूं। और मुझे लगता है कि यह कम समय लगेगा अगर आप में से कोई एक पुरुष / महिला उत्तर को जानता था।
क्रीथिक

26
मुझे पसंद है कि जब मैंने पहली बार यह सवाल पूछा था, तो यह गुमनामी में बदल गया था और अब, दो साल बाद, यह ++ तक है।
क्रीथिक

46
गंभीरता से। इस प्रश्न की उपयोगिता पर किसी को कैसे संदेह हो सकता है? क्या आप आदमी के घंटों की कुल बर्बादी की कल्पना कर सकते हैं , अगर हर कोई यह सवाल पूछ रहा है कि 'इसे खुद आजमाएं और देखें?' यहां तक ​​कि अगर केवल 5 मिनट लगते हैं, तो 10,000 से अधिक डेवलपर्स को गुणा करें, जिन्होंने इस प्रश्न को अभी तक देखा है। और तब आप क्या करते हैं जब कोई सहकर्मी आपके परिणामों पर संदेह करता है? इन सबको फिर से करो? या शायद उन्हें सिर्फ इस एसओ पद के लिए देखें। यह क्या है के लिए यह है कि Sorta है।
BTownTKD

8
@BTownTKD आप के लिए विशिष्ट Stackoverflow व्यवहार है। यदि कोई इस उद्देश्य के लिए साइट का उपयोग करता है, तो वे तुरंत अलग हो जाते हैं। यह भी एक कारण है कि मुझे लगता है कि हमें सामूहिक रूप से प्रतिबंध लगाने की अनुमति दी जानी चाहिए। बहुत से लोग बस इस साइट पर रहने के लायक नहीं हैं।
21th पर Krythic

जवाबों:


72

ध्यान देने योग्य है सापेक्ष। हालाँकि: स्ट्रिंग प्रक्षेप को string.Format()संकलन-समय में बदल दिया जाता है , इसलिए उन्हें उसी परिणाम के साथ समाप्त होना चाहिए।

हालांकि सूक्ष्म अंतर हैं: जैसा कि हम इस प्रश्न से कह सकते हैं , प्रारूप में स्ट्रिंग संयोजन एक अतिरिक्त string.Concat()कॉल में परिणाम देता है ।


4
वास्तव में, स्ट्रिंग प्रक्षेप कुछ मामलों में स्ट्रिंग संघनन में संकलित कर सकता है (जैसे जब intउपयोग किया जाता है)। var a = "hello"; var b = $"{a} world";संकलित करने के लिए संकलन। var a = "hello"; var b = $"{a} world {1}";स्ट्रिंग प्रारूप के लिए संकलित।
उमर मस्केल्टो

5

स्ट्रिंग प्रक्षेप को स्ट्रिंग में बदल दिया जाता है। संकलन () संकलन-समय पर।

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

a = string.Format("Due date is {0:M/d/yy} at {0:h:mm}", someComplexObject.someObject.someProperty);

b = $"Due date is {someComplexObject.someObject.someProperty:M/d/yy} at {someComplexObject.someObject.someProperty:h:mm}";

कुछ प्रदर्शन परीक्षा परिणाम https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a है


2
स्ट्रिंग प्रक्षेप बस कभी-कभी बदल जाता है String::Format। और कभी-कभी में String::Concat। और उस पृष्ठ पर प्रदर्शन-परीक्षण वास्तव में सार्थक नहीं है: उन विधियों में से प्रत्येक में आपके द्वारा पारित किए गए तर्कों की मात्रा निर्भर है। अवतल हमेशा सबसे तेज नहीं होता है, स्ट्रिंगर हमेशा सबसे धीमा नहीं होता है।
मथायस बर्गर

3

सवाल प्रदर्शन के बारे में था, हालांकि शीर्षक सिर्फ "बनाम" कहता है, इसलिए मुझे लगता है कि कुछ और बिंदुओं को जोड़ना होगा, उनमें से कुछ को हालांकि माना जाता है।

  • स्थानीयकरण

    • इनलाइन कोड प्रकृति के कारण स्ट्रिंग प्रक्षेप को स्थानीय नहीं किया जा सकता है। स्थानीयकरण से पहले इसे बदल दिया गया है string.Format। हालाँकि, इसके लिए टूलिंग है (जैसे ReSharper)।
  • रखरखाव (मेरी राय)

    • string.Formatयह कहीं अधिक पठनीय है, क्योंकि यह उस वाक्य पर केंद्रित है जो मैं वाक्यांश के लिए करना चाहता हूं, उदाहरण के लिए जब एक अच्छा और सार्थक त्रुटि संदेश का निर्माण। {N}प्लेसहोल्डर का उपयोग करने से मुझे अधिक लचीलापन मिलता है और बाद में इसे संशोधित करना आसान होता है।
    • इसके अलावा, अंतर्ग्रहण में निर्दिष्ट प्रारूप निर्दिष्ट करना गलत होना आसान है, और बदलाव के दौरान अभिव्यक्ति को एक साथ हटाना आसान है।
    • जटिल और लंबी अभिव्यक्तियों का उपयोग करते समय, प्रक्षेप जल्दी से पढ़ने और बनाए रखने के लिए और भी अधिक कठिन हो जाता है, इसलिए इस अर्थ में कोड विकसित होने और अधिक जटिल होने पर यह अच्छी तरह से पैमाने पर नहीं होता है। string.Formatइससे बहुत कम खतरा है।
    • दिन के अंत में यह सब चिंताओं की जुदाई के बारे में है: मैं मिश्रण करना पसंद नहीं है कि यह कैसे पेश करना चाहिए के साथ क्या प्रस्तुत किया जाना चाहिए

इसलिए इन के आधार पर मैंने string.Formatअपने अधिकांश कोड में साथ रहने का फैसला किया । हालाँकि, मैंने कोडिंग के अधिक धाराप्रवाह तरीके के लिए एक विस्तार विधि तैयार की है जो मुझे बहुत पसंद है। एक्सटेंशन का कार्यान्वयन एक-लाइनर है, और यह उपयोग में बस इस तरह दिखता है।

var myErrorMessage = "Value must be less than {0:0.00} for field {1}".FormatWith(maximum, fieldName);

प्रक्षेप एक महान विशेषता है, मुझे गलत मत समझो। लेकिन IMO यह उन भाषाओं में सबसे अच्छा चमकता है, जो string.Formatउदाहरण के लिए, जावास्क्रिप्ट जैसी मिसाल पेश करती हैं।


इसे जोड़ने के लिए धन्यवाद।
क्रीथिक

1
मैं स्थिरता पर असहमत हूँ; प्रदान की गई ReSharper अपने संबंधित सूचकांकों (और इसके विपरीत) के साथ सम्मिलित मूल्यों को मिलाना कुछ हद तक आसान बनाता है, लेकिन मुझे लगता है कि यह अभी भी अधिक संज्ञानात्मक भार है अगर {3}यह पता लगाना है कि क्या एक्स या वाई विशेष रूप से यदि आप अपने प्रारूप को फिर से व्यवस्थित करना शुरू करते हैं। मैडलिब उदाहरण: $"It was a {adjective} day in {month} when I {didSomething}"बनाम string.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)-> $"I {didSomething} on a {adjective} {month} day"बनामstring.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
ड्रूज़

@drzaus अपने विचार साझा करने के लिए धन्यवाद। आपके पास अच्छे अंक हैं, हालांकि यह केवल तभी सच है जब हम केवल सरल, अच्छी तरह से नामित स्थानीय चर का उपयोग करते हैं। मैंने जो कई बार देखा है वह जटिल अभिव्यक्ति, फ़ंक्शन कॉल है, जो भी प्रक्षेपित स्ट्रिंग में डाला जाता है। साथ string.Formatमुझे लगता है कि आप बहुत कम इस मुद्दे से ग्रस्त हैं। लेकिन वैसे भी, मैंने इस बात पर जोर दिया कि यह मेरी राय है :)
ज़ोल्टन तामसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.