string.format वैरिएबल बनाम इनलाइन वैरिएबल के साथ


9

उपयोग करने के लिए पेशेवरों / विपक्ष (यदि कोई हो) क्या हैं

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

बनाम

string output; 
int i = 10;
output = "the int is " + i;

मैंने हमेशा बाद के उदाहरण का उपयोग किया है, लेकिन ऐसा लगता है कि ऑनलाइन ट्यूटोरियल का एक अच्छा हिस्सा string.format उदाहरण का उपयोग करता है। मुझे नहीं लगता कि दक्षता के मामले में कोई वास्तविक अंतर हैं, मेरा प्रारंभिक विचार इतना है कि एक कोडर को चर डालने के लिए स्ट्रिंग को तोड़ते नहीं रहना पड़ता है।


8
मुख्य कारण यह है कि यह अनुवाद को बहुत आसान बनाता है, क्योंकि आपके प्रोग्राम को विभिन्न भाषाओं को उनके वाक्यों के निर्माण के तरीके को समझने की आवश्यकता नहीं है। उदाहरण के लिए, फ्रेंच में कई भाव और वाक्यांश उनके अंग्रेजी अनुवादों की तुलना में बैक-टू-फ्रंट हैं।
JohnL

जवाबों:


22

यदि आप अनुवाद को अपनी परियोजना में महत्वपूर्ण मानते हैं, तो पहला वाक्यविन्यास वास्तव में इसके साथ मदद करेगा।

उदाहरण के लिए आपके पास हो सकता है:

static final string output_en = "{0} is {1} years old.";
static final string output_fr = "{0} a {1} ans.";

int age = 10;
string name = "Henri";
System.out.println(string.Format(output_en, name, age));
System.out.println(string.Format(output_fr, name, age));

यह भी ध्यान दें कि वाक्य विन्यास के साथ वाक्य में आपके चर हमेशा एक ही स्थान पर नहीं हो सकते हैं:

static final string output_yoda = "{1} years {0} has.";

4
वस्तु-विषय-क्रिया वाक्यविन्यास के उदाहरण के रूप में योदा-बोलने के लिए +1।
माइक हैरिस

1
C # के साथ हमारे पास एक नया विकल्प है:System.out.println($"{name} is {age} year's old.");
बेरिन लोरिट्स


@BerinLoritsch: जो दुर्भाग्य से, स्थानीयकरण के लिए पूरी तरह से अनुपयोगी है।
ब्रायन बोएचेचर

@BryanBoettcher, समझ गया, लेकिन मैंने ओपी में यह कहते हुए कुछ भी नहीं देखा कि वे क्या हासिल करने की कोशिश कर रहे थे।
बेरिन लोरिट्स

8

Https://stackoverflow.com/questions/4671610/why-use-string-format के लिए पहला उत्तर देखें । यह मेरी राय में सब कुछ शामिल करता है क्योंकि यह बेहतर क्यों है।

इसके अलावा, प्रत्येक .NET असेंबली में एक आंतरिक पूल होता है, जिसमें अद्वितीय तार का संग्रह होता है। जब आपका कोड संकलित किया जाता है, तो आपके कोड में संदर्भित सभी स्ट्रिंग शाब्दिक इस पूल में जुड़ जाते हैं। यदि आपके पास एक कोड है जो इस तरह दिखता है:

"the int is " + i + " and the double is " + d

यह पूल में 2 तार बनाता है।

यदि आपके पास है:

"the int is {0} and the double is {1}"

आपके पास पूल में केवल एक स्ट्रिंग है।

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

संपादित करें: थोड़ा खोदने के बाद, मुझे इस सवाल का एक दिलचस्प जवाब मिला है कि String.Format बनाम स्ट्रिंग संघनन का उपयोग करना कब बेहतर है? । संक्षेप में, स्थानीयकरण शामिल नहीं होने पर +30 वोटों के साथ उत्तर देने वाला लेखक स्ट्रिंग के संघटन के पक्ष में एक सम्मोहक तर्क देता है।


2
मुझे भी लगता है कि, शैलीगत रूप से, यह मेरे जैसे लोगों के साथ प्रतिध्वनित होता है, जो कि सी से प्रिंटफ और स्प्रिंटफ के अभ्यस्त हैं।
जोनाथन हेंसन

मुझे यह जानकर अच्छा लगा कि मेरे जवाब को ठीक करने के लिए नीचे की तरफ क्यों। धन्यवाद।
जलयन्

4

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

मुझे यकीन है कि अतिरिक्त स्ट्रिंग्स बनाने के लिए नहीं होने के कारण पहले तरीके से एक प्रदर्शन लाभ है; लेकिन यह मेरी प्राथमिक चिंता नहीं है।


2

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


आह, मुझे लगता है, मुझे लगता है कि मैंने उदाहरण के बारे में नहीं सोचा था: string.format ("int {0} है। फिर से यह {0}", int) है;
जिम

1

मुझे लगता है कि string.Format()यह देखना आसान है कि वास्तव में क्या परिणाम होने वाला है (इसलिए आपको भूली हुई जगहों या इस तरह की कोई समस्या नहीं है), और इसे टाइप करना और संशोधित करना भी आसान है।

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

यह दिखाने के लिए कि कैसे string.Format()संशोधित करना आसान है, विचार करें कि आप अपने उदाहरण में वाक्य के अंत में एक पूर्ण विराम जोड़ना चाहते थे: से string.Format("The int is {0}", i)जाना string.Format("The int is {0}.", i)सिर्फ एक चरित्र है। लेकिन से जा रहा "the int is " + iकरने के लिए "the int is " + i + '.'बहुत अधिक है।

इसका एक और फायदा string.Format()यह है कि यह आपको प्रारूप का उपयोग करने के लिए आसानी से निर्दिष्ट करने की अनुमति देता है, जैसे string.Format("The int is 0x{0:X}.", i)। यह तब और भी अधिक महत्वपूर्ण होता है जब तारीख को प्रारूपित किया जाता है।

दक्षता के लिए, string.Format()सबसे अधिक संभावना है कि सरल स्ट्रिंग संयोजन। लेकिन इस तरह कोड एक गर्म रास्ते पर नहीं होने की सबसे अधिक संभावना है, इसलिए यह कोई फर्क नहीं पड़ता। और अगर ऐसा होता है, तो आप उपयोग करने से बेहतर हैं StringBuilder


string.Format आंतरिक रूप से वैसे भी एक StringBuilder का उपयोग करता है
ब्रायन Boettcher

1

उस कोड का उपयोग करें जो आपके कोड को सबसे अधिक पठनीय बनाता है। प्रदर्शन के बारे में चिंता मत करो।

नीचे आपके उदाहरण के लिए मैं बी पसंद करता हूं क्योंकि यह सिर्फ अधिक पठनीय है। लेकिन ऊपर की भाषा का अनुवाद भी समझ में आता है। किसी को भी आपको स्ट्रिंग का उपयोग करने के लिए मजबूर न करें। इसके बजाय, पढ़ें और माइक्रो ऑप्टिमाइज़ेशन थिएटर की दुखद त्रासदी पर जेफ एटवुड के उत्कृष्ट ब्लॉग को इंगित करें

ए:

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

बनाम

बी:

string output; 
int i = 10;
output = "the int is " + i;

-1

रेफरी: स्ट्रिंग आउटपुट: प्रारूप या सी # में कॉनैट?

इस कोड पर विचार करें।

यह आपके कोड का थोड़ा संशोधित संस्करण है।

  1. मैंने Console.WriteLine को हटा दिया क्योंकि यह शायद कुछ माप के आदेशों से कम है जो मैं मापने की कोशिश कर रहा हूं।
  2. मैं स्टॉपवॉच को लूप से पहले घूर रहा हूं और इसे ठीक से रोक रहा हूं, इस तरह से मैं सटीक नहीं खो रहा हूं यदि फ़ंक्शन उदाहरण के लिए निष्पादित करने के लिए 26.4 टिक्स लेता है।
  3. जिस तरह से आपने पुनरावृत्तियों द्वारा परिणाम विभाजित किया वह गलत था। यदि आपके पास 1000 मिलीसेकंड और 100 मिलीसेकंड है तो देखें कि क्या हैपेंस है। दोनों स्थितियों में आपको 1000000 से विभाजित करने के बाद 0 एमएस मिलेगा।
Stopwatch s = new Stopwatch();

var p = new { FirstName = "Bill", LastName = "Gates" };

int n = 1000000;
long fElapsedMilliseconds = 0, fElapsedTicks = 0, cElapsedMilliseconds = 0, cElapsedTicks = 0;

string result;
s.Start();
for (var i = 0; i < n; i++)
    result = (p.FirstName + " " + p.LastName);
s.Stop();
cElapsedMilliseconds = s.ElapsedMilliseconds;
cElapsedTicks = s.ElapsedTicks;
s.Reset();
s.Start();
for (var i = 0; i < n; i++)
    result = string.Format("{0} {1}", p.FirstName, p.LastName);
s.Stop();
fElapsedMilliseconds = s.ElapsedMilliseconds;
fElapsedTicks = s.ElapsedTicks;
s.Reset();


Console.Clear();
Console.WriteLine(n.ToString()+" x result = string.Format(\"{0} {1}\", p.FirstName, p.LastName); took: " + (fElapsedMilliseconds) + "ms - " + (fElapsedTicks) + " ticks");
Console.WriteLine(n.ToString() + " x result = (p.FirstName + \" \" + p.LastName); took: " + (cElapsedMilliseconds) + "ms - " + (cElapsedTicks) + " ticks");
Thread.Sleep(4000);

वे मेरे परिणाम हैं:

1000000 x result = string.Format("{0} {1}", p.FirstName, p.LastName); took: 618ms - 2213706 ticks
1000000 x result = (p.FirstName + " " + p.LastName); took: 166ms - 595610 ticks

1
अगर यह पहला कोड उदाहरण या दूसरा कोड उदाहरण एक बेहतर डिज़ाइन है, तो इसके पहलुओं का जवाब कैसे दिया जाता है? अगर यह किसी व्यक्ति को बनाए रखने या न रखने के लिए आसान कोड है, तो 1M पुनरावृत्तियों पर आधे से अधिक सेकंड कैसे खाते हैं?

जिम ने पूछा, "पेशेवरों और विपक्ष क्या हैं?" इससे पता चलता है कि कई पुनरावृत्तियों में, String.Format तेज है।
jp2code

आपको इसे कोड के ब्लॉक के रूप में और ओपी के कोड से अंतर के रूप में छोड़ने के बजाय पूरी तरह से अपने उत्तर में जोड़ने पर विचार करना चाहिए। जैसा कि यह खड़ा है, आपका जवाब अंग्रेजी में ओपी के सवाल का जवाब नहीं देता है। दूसरे जवाब देखिए। उनके पास से सभी कोड निकालना संभव होगा और अभी भी ओपी के सवाल का जवाब होगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.