2009-12-29 15 views
7

मैं एक बयान जहां एक स्ट्रिंग निम्नलिखित तरीके से असाइन किया गया है:स्ट्रिंग concatenation के साथ या बिना। ToString()?

for (int i = 0; i < x; i++) 
{ 
    Foo.MyStringProperty = "Bar_" + i.ToString(); 
    /* ... */ 
} 

वहाँ के बीच i.ToString() या बस सामान्य i, दोनों के रूप में बस (? संस्कृति अपरिवर्तनीय) स्ट्रिंग बराबर करने के लिए परिवर्तित कर रहे हैं किसी भी प्रदर्शन अंतर है?

मैं String.Concat(), String.Format, StringBuilder, आदि के अस्तित्व से अच्छी तरह परिचित हूं, लेकिन इस मामले के लिए, की सुविधा देता है मान मैं केवल + संयोजन का उपयोग कर सकते हैं।

अग्रिम धन्यवाद।

+3

क्या आप टेस्टप्लिकेशन नहीं कर सकते? इसे 10.000 बार लूप दें, समय मापें और आपको जवाब पता है। – Natrium

+3

चेतावनी: 'ToString()' वर्तमान संस्कृति का उपयोग करता है। यदि आप संस्कृति-स्वतंत्र रूपांतरण चाहते हैं तो आपको 'ToString (CultureInfo.InvariantCulture)' का उपयोग करना होगा (यह पूर्णांक के मुकाबले फ़्लोटिंग पॉइंट नंबर से निपटने पर अधिक महत्वपूर्ण है)। –

उत्तर

23

+ कंसटेनेशन String.Concat वैसे भी उपयोग करता है - String स्वयं एक + ऑपरेटर का पर्दाफाश नहीं करता है।

उदाहरण के लिए

तो: ToString बुला सीधे मुक्केबाजी से बचने और Concat(string, string) अधिभार फोन करेगा जबकि

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

:

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

में संकलित किया गया है। इसलिए ToString कॉल के साथ संस्करण थोड़ा अधिक कुशल होगा - लेकिन मुझे अत्यधिक संदेह है कि यह महत्वपूर्ण होगा, और मैं आपको दृढ़ता से आग्रह करता हूं कि आप जो भी संस्करण महसूस करेंगे, वह अधिक पठनीय है।

+0

धन्यवाद, बहुत स्पष्ट उत्तर। हालांकि, मैं संस्कृति की जानकारी के बारे में उनकी चेतावनी के कारण, इसके बजाय divo की टिप्पणी स्वीकार करने का लुत्फ उठाऊंगा। – Webleeuw

+0

मेरे परीक्षण में एक मूल्य प्रकार के मुक्केबाजी और अनबॉक्सिंग जब ToString विधि का उपयोग नहीं करते हैं तो 2.5% प्रदर्शन हिट का कारण बनता है। – Firestrand

+1

दिलचस्प। मैंने सोचा कि शायद सी # कंपाइलर दो स्थितियों में एक ही आईएल उत्पन्न करेगा, लेकिन आप सही हैं, यह नहीं (सी # 5 के साथ नहीं)। एक संदर्भ प्रकार के साथ स्थिति थोड़ा अलग है। यहां 'ओब्जे' एक शून्य संदर्भ है, भले ही कोड 'हैलो "+ obj' फेंक नहीं देगा। लेकिन 'हैलो "+ obj.ToString()' फेंक देगा अगर 'obj' शून्य है, ज़ाहिर है। हालांकि, संदर्भ प्रकारों के साथ भी स्पष्ट 'टॉस्ट्रिंग() 'के साथ शैली सैद्धांतिक रूप से तेज़ी से हो सकती है (जब' obj' गैर-शून्य है) क्योंकि यह' Concat (ऑब्जेक्ट) के बजाय 'Concat (string, string)' अधिभार का उपयोग करता है , ऑब्जेक्ट) 'ओवरलोड। –

7

बस string + object का उपयोग ऑब्जेक्ट पर ToString() को कॉल करने के लिए मजबूर करता है - यह स्पष्ट रूप से इसे कॉल करने के बराबर है।

+3

@Aviad: समय में एक अंतर है, हालांकि - यह प्रभावित करता है कि मूल्य बॉक्स किया गया है या नहीं। –

1

मैं आदत और पठनीयता से बाहर। ToString() का उपयोग करता हूं, मुझे यकीन है कि आपको कहीं और बेहतर प्रदर्शन की बचत मिल जाएगी।

3

ToString एक ऑब्जेक्ट लिखने के लिए उपयोग की जाने वाली डिफ़ॉल्ट विधि है। इसलिए, यदि आप "i" या "i.ToString()" का उपयोग करते हैं तो वही बात है।

यदि आप सी ++ में ऑपरेटर ओवरलोडिंग के बारे में कुछ जानते हैं तो आप समझ सकते हैं कि इस मामले में "+" कैसे काम करता है।

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.IO; 
using System.Text; 


public class MainClass 
{ 
    public static void Main() 
    { 
     int number = 10; 
     string msg = "age is " + number + "."; 
     msg += " great?"; 
     Console.WriteLine("msg: {0}", msg); 

     String s1 = 10 + 5 + ": Two plus three is " + 2 + 3; 
     String s2 = 10 + 5 + ": Two plus three is " + (2 + 3); 
     Console.WriteLine("s1: {0}", s1); 
     Console.WriteLine("s2: {0}", s2); } 

} 

परिणाम: संदेश: उम्र 10 महान है?

एस 1: 15: दो और तीन 23

s2 है: 15: दो के अलावा तीन 5

0
for(int i = 0; i < x; i++) { 
    Foo.MyStringProperty = "Bar_" + i.ToString(); 
    [...] 
} 

है यहाँ के बाद से अपने परिणामी स्ट्रिंग में है और मैं पूर्णांक है, इसलिए "बार _" + मैं एक स्ट्रिंग के साथ संलग्न होने के लिए ऑब्जेक्ट के लिए .oString() को संयोजित कर दूंगा। के बारे में प्रदर्शन आप कुछ निष्पादन माप उपकरण

मैं आम तौर पर, कास्टिंग का उपयोग करता है, तो मैं दो diff वस्तुओं

+0

अगर आपकी समस्या हल होती है तो अच्छा या बुरा वोट दें –

0

जैसा कि पहले ही जॉन स्कीट ने उल्लेख किया है उपयोग कर सकते हैं, मुक्केबाजी के बारे में बात बहुत महत्वपूर्ण है!

यदि आप स्पष्ट रूप से ToString() का उपयोग करते हैं तो कोई मुक्केबाजी नहीं है, जिसका अर्थ है कि मेरे आस-पास कोई ऑब्जेक्ट-बॉक्स नहीं बनाया गया है। मेरे आस-पास ऑब्जेक्ट बॉक्स को कचरा कलेक्टर द्वारा बाद में फेंक दिया जाना चाहिए, जिससे प्रदर्शन जुर्माना हो सकता है।

यदि आप इसे अपने कार्यक्रम में केवल कुछ बार कर रहे हैं तो इससे कोई फर्क नहीं पड़ता, लेकिन यदि आप अक्सर मुक्केबाजी कर रहे हैं, तो आपको ToString() संस्करण के लिए जाना चाहिए।

संबंधित मुद्दे