2009-04-09 10 views
53

में तारों में शामिल होने के लिए + और और के बीच का अंतर VB.NET में तारों में शामिल होने के लिए + और & के बीच क्या अंतर है?वीबीएनईटी

उत्तर

67

वहाँ कोई अंतर नहीं है अगर दोनों ऑपरेंड तार कर रहे हैं। हालांकि, यदि एक ऑपरेंड एक स्ट्रिंग है, और एक संख्या है, तो आप समस्याओं में भाग लेते हैं, नीचे दिए गए कोड को देखें।

"abc" + "def" = "abcdef" 
"abc" & "def" = "abcdef" 
"111" + "222" = "111222" 
"111" & "222" = "111222" 
"111" & 222 = "111222" 
"111" + 222 = 333 
"abc" + 222 = conversion error 

इसलिए मैं हमेशा & उपयोग करने के लिए जब आप को श्रेणीबद्ध करने के लिए मतलब है, क्योंकि आप एक पूर्णांक, नाव, एक स्ट्रिंग, जिस पर सबसे अच्छा एक अपवाद के कारण, या जाएगा दशमलव श्रेणीबद्ध करने की कोशिश कर रहा हो सकता है की सलाह देते हैं, ऐसा नहीं क्या आप शायद यह करना चाहते हैं।

+11

या हमेशा विकल्प सख्त ऑन को लागू करें, इस मामले में आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। विकल्प सख्त ऑन के कई अन्य फायदे भी हैं: http://stackoverflow.com/questions/222370/option-strict-on-and-net-for-vb6-programmers – mattmc3

+3

स्ट्रिंग concatenation के लिए '&' के साथ एक समस्या है। [प्रलेखन] से (http://msdn.microsoft.com/en-us/library/te2585xw.aspx) "ऑप्शन सख्त की सेटिंग के बावजूद," ऑपरेटर हमेशा अपने ऑपरेटरों को स्ट्रिंग पर विस्तृत करता है "। तो उदाहरण के लिए 'हैलो "और 2.5' क्षेत्रीय सेटिंग्स का उपयोग करके 2.5 को एक स्ट्रिंग में चुपचाप रूपांतरित कर देगा (आपको' 2.5 "' या '" 2,5 "' मिल सकता है)। ठीक है अगर वह वही था जो आप चाहते थे। मैं बहुत अधिक, स्पष्ट रूप से निर्दिष्ट करने के लिए मजबूर होना होगा। – MarkJ

+0

@ मार्कज ओह हाँ, अगर आप इसे नहीं देखते हैं तो क्षेत्रीय सामान वास्तव में आपको प्राप्त कर सकता है। विशेष रूप से वेब सर्वर पर। यदि आपके पास वेब सर्वर का समूह है, तो आपको यह सुनिश्चित करना चाहिए कि वे सभी एक ही क्षेत्रीय सेटिंग्स के लिए कॉन्फ़िगर किए गए हैं, जिससे आप संख्याओं और तिथियों के साथ व्यापक प्रारूपण समस्याएं प्राप्त कर सकते हैं। – Kibbee

0

कोई नहीं जब तार में शामिल होने:

Dim string1 As String = "A" + "B" 
    Dim string2 As String = "A" & "B" 

    If string1.Equals(string2) And string2.Equals(string1) Then 
     Debugger.Break() 
    End If 
12

& ऑपरेटर हमेशा जबकि + ऑपरेटर अधिभार कि ऑपरेंड से मेल खाता है पाता है सुनिश्चित करती है कि दोनों ऑपरेंड तार कर रहे हैं।

अभिव्यक्ति 1 & 2, मूल्य "12" देता है, जबकि अभिव्यक्ति 1 + 2 मूल्य 3.

दोनों ऑपरेंड तार कर रहे हैं देता है, वहाँ परिणाम में कोई अंतर नहीं है।

+0

+ ऑपरेटर केवल 'विकल्प सख्त' बंद होने पर निहित रूपांतरण करता है। लेकिन ऑपरेटर 'विकल्प सख्त' सेटिंग के बावजूद स्ट्रिंग में अंतर्निहित रूपांतरण करेगा। [दस्तावेज़ीकरण] (http://msdn.microsoft.com/en-us/library/te2585xw.aspx) "ऑप्शन सख्त की सेटिंग के बावजूद, ऑपरेटर हमेशा अपने ऑपरेटरों को स्ट्रिंग में चौड़ा करता है"। तो उदाहरण के लिए 'हैलो "और 2.5' क्षेत्रीय सेटिंग्स का उपयोग करके 2.5 को एक स्ट्रिंग में चुपचाप रूपांतरित कर देगा (आपको' 2.5 "' या '" 2,5 "' मिल सकता है)। ठीक है अगर वह वही था जो आप चाहते थे। – MarkJ

2

अधिकांश मामलों में कोई अंतर नहीं है। हालांकि, सबसे अच्छा अभ्यास है:

"+", पूर्णांक जोड़ के लिए आरक्षित किया जाना चाहिए, क्योंकि यदि आप विकल्प जैसे तो क्या तुम सच में में गड़बड़ हो सकता है स्थितियों पर सख्त का उपयोग नहीं करते:

Input + 12 आपको 812 के बजाय 20 दे सकता है। यह एएसपी.नेट आवेदन में विशेष रूप से खराब हो सकता है जहां इनपुट POST/GET से आता है।

बस डालें: तारों में शामिल होने के लिए, हमेशा "+12" के बजाय "" का उपयोग करें।

जाहिर है, StringBuilder का उपयोग जहां यह उपयुक्त है :)

3

+ ऑपरेटर या तो अतिरिक्त या संयोजक हो सकता है। & केवल concatenation है। यदि अभिव्यक्ति दोनों स्ट्रिंग हैं तो परिणाम समान होंगे।

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

1

यदि दोनों प्रकार के मानदंड System.String पर टाइप किए गए हैं, तो कोड के बीच शून्य अंतर है। दोनों String.Concat सदस्य को हल करेंगे (यह + तारों के लिए करता है)।

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

& ऑपरेटर समेकित करने का प्रयास करेगा। विजुअल बेसिक रनटाइम दोनों मानों को तारों में बदलने के लिए सभी प्रकार के रूपांतरणों के माध्यम से जाएगा। इसके बाद परिणाम String.Concat परिणाम होंगे।

+0

यह भी उल्लेखनीय है कि '&' ऑपरेटर ** विकल्प सख्त ** की उपेक्षा करता है। [प्रलेखन] से (http://msdn.microsoft.com/en-us/library/te2585xw।एएसपीएक्स) "ऑप्शन सख्त की सेटिंग के बावजूद, ऑपरेटर हमेशा अपने ऑपरेटरों को स्ट्रिंग में चौड़ा करता है"। तो उदाहरण के लिए 'हैलो "और 2.5' क्षेत्रीय सेटिंग्स का उपयोग करके 2.5 को एक स्ट्रिंग में चुपचाप रूपांतरित कर देगा (आपको' 2.5 "' या '" 2,5 "' मिल सकता है)। ठीक है अगर वह वही था जो आप चाहते थे। '+ 'के साथ तुलना करें जो सख्त है' विकल्प विकल्प ' – MarkJ

7

कोई नहीं।

जैसा कि आप नीचे देख सकते हैं। (ध्यान दें System.String::Concat)

Module Module1 

Sub Main() 
    Dim s1 As String = "s1" 
    Dim s2 As String = "s2" 
    s2 += s1 
    s1 &= s2 
End Sub 

End Module 

को संकलित करता है: कोड के इन दो पंक्तियों को एक ही आईएल कोड वास्तव में संकलित

.method public static void Main() cil managed 
{ 
.entrypoint 
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = (01 00 00 00) 
// Code size  31 (0x1f) 
.maxstack 2 
.locals init ([0] string s1, 
     [1] string s2) 
IL_0000: nop 
IL_0001: ldstr  "s1" 
IL_0006: stloc.0 
IL_0007: ldstr  "s2" 
IL_000c: stloc.1 
IL_000d: ldloc.1 
IL_000e: ldloc.0 
IL_000f: call  string [mscorlib]System.String::Concat(string, 
                  string) 
IL_0014: stloc.1 
IL_0015: ldloc.0 
IL_0016: ldloc.1 
IL_0017: call  string [mscorlib]System.String::Concat(string, 
                  string) 
IL_001c: stloc.0 
IL_001d: nop 
IL_001e: ret 
} // end of method Module1::Main 
+0

धन्यवाद अलीस्टाड, जो इसे पूरी तरह से बताता है। मैं सबसे उत्सुक था (और शायद इसे मेरे प्रश्न में थोड़ा बेहतर बताया जाना चाहिए) कि इसे कैसे संभाला गया था। स्ट्रिंग + स्ट्रिंग (जब तक वे दोनों तार हैं) स्ट्रिंग और स्ट्रिंग के समान है (चाहे + ऑपरेटर के साथ नियमों के जटिल सेट के बावजूद)। – rickp

+0

कोई जांच नहीं। ILDASM का उपयोग करके आईएल कोड को देखना हमेशा अच्छा होता है। प्रारंभ में यह अपरिचित है लेकिन धीरे-धीरे आप इसका उपयोग करते हैं। – Aliostad

1

सीधे MSDN प्रलेखन से: के बीच दो Concatenation Operators in Visual Basic

मतभेद Concatenation ऑपरेटर

+ ऑपरेटर (विजुअल बेसिक) में प्राइ दो संख्याओं को जोड़ने का मैरी उद्देश्य। हालांकि, यह संख्या संचालन के साथ संख्यात्मक ऑपरेटरों को भी जोड़ सकता है। + ऑपरेटर के नियमों का एक जटिल सेट है जो निर्धारित करता है कि एक कंपाइलर त्रुटि को जोड़ना, जोड़ना, सिग्नल करना, या रन-टाइम अमान्यकास्ट अपवाद अपवाद को फेंकना है या नहीं।

& ऑपरेटर (विजुअल बेसिक) केवल स्ट्रिंग ऑपरेंड के लिए परिभाषित किया गया है, और यह हमेशा स्ट्रिंग के लिए अपनी ऑपरेंड चौड़ी, विकल्प सख्त की सेटिंग कुछ भी हो। स्ट्रिंग कॉन्सटेनेशन के लिए & ऑपरेटर की अनुशंसा की जाती है क्योंकि यह विशेष रूप से तारों के लिए परिभाषित किया जाता है और एक अनपेक्षित रूपांतरण उत्पन्न करने के आपके को कम करता है।

एमएसडीएन पर भरोसा करें! :-)