5

स्ट्रिंग ऑब्जेक्ट == और! = ऑपरेटरों का उपयोग करते समय वैल्यू प्रकार की तरह व्यवहार करता है जिसका अर्थ है संदर्भ के बजाए वास्तविक वस्तु की जांच की जाती है।कैसे एक स्ट्रिंग प्रकार किसी विधि को पास किया जाता है या सी # में एक चर के लिए असाइन किया जाता है?

पैरामीटर पास करने, असाइनमेंट और कॉपी करने के बारे में क्या?

स्ट्रिंग पैरामीटर पासिंग: एक संदर्भ प्रकार एक विधि के लिए पारित किया जाता है, इसके संदर्भ नकल की जाती है लेकिन अंतर्निहित वस्तु ही रहता है।

क्या यह स्ट्रिंग प्रकार सी # के बारे में भी सच होगा?

public static void main() 
{ 
    string messageVar = "C#"; 
    Test(messageVar); 

    // what about in assignement? 
    string messageVar2 = messageVar; 
} 
public void Test(string messageParam) 
{ 
// logic 
} 

के बारे में क्या जब यह एक चर के लिए निर्दिष्ट की: मैं वहाँ 2 संकेत (messageVar और messageParam) नीचे दिए गए कोड में एक ही वस्तु की ओर इशारा करते होगा मतलब है? मुझे लगता है कि संदर्भ केवल कॉपी किया जाएगा और वास्तविक वस्तु स्ट्रिंग इंटरनेशनल पूल में एक ही कैश रहती है। निश्चित नहीं।

संदेश क्या होगा Var2 भी उसी वस्तु को संदर्भित करता है?

धन्यवाद,

उत्तर

3

हां, आप सही हैं केवल संदर्भों की प्रतिलिपि बनाई गई है, ऑब्जेक्ट इंस्टेंस संदर्भित एक और एक जैसा है।

आप आसानी से इस Object.ReferenceEquals() इसका परीक्षण करना है, तो दो संदर्भ एक ही वस्तु उदाहरण के लिए बिंदु सत्यापित कर सकते हैं - मैं अपने उदाहरण इस दिखाने के लिए थोड़ा संशोधित:

static string messageVar = "C#"; 
public static void Main(string[] args) 
{ 
    bool isSame = Test(messageVar); //true 

    // what about in assignement? 
    string messageVar2 = messageVar; 
    isSame = Object.ReferenceEquals(messageVar2, messageVar);//also true 
} 

public static bool Test(string messageParam) 
{ 
    // logic 
    bool isSame = Object.ReferenceEquals(messageParam, messageVar); 
    return isSame; 
} 
+0

अच्छा; ऑब्जेक्ट्स एक्वाल्स और ऑब्जेक्ट के बीच क्या अंतर है। स्ट्रिंग्स के साथ काम करते समय संदर्भ। –

+0

तारों के लिए 'बराबर()' संदर्भ के बावजूद * स्ट्रिंग समानता * के लिए परीक्षण करेगा, उदा। "foo" "foo" के बराबर है, भले ही दोनों स्ट्रिंग अलग-अलग ऑब्जेक्ट उदाहरणों को इंगित करें – BrokenGlass

0

यह वही होता है जो वास्तव में होता है।

string एस के साथ छोटा मोड़ यह है कि वे अपरिवर्तनीय हैं: ऐसा कोई भी ऑपरेशन जो स्ट्रिंग को संशोधित करने जैसा दिखता है वास्तव में एक नया बनाता है। इसलिए बनाए जाने के बाद स्ट्रिंग्स को बदला नहीं जा सकता है। इसके अलावा, तार किसी अन्य संदर्भ प्रकार की तरह काम करते हैं: उन्हें संदर्भ द्वारा एक्सेस किया जाता है, और उन्हें किसी फ़ंक्शन में पास करने से संदर्भ की एक प्रति पास होती है (जब तक आप ref या out का उपयोग नहीं करते), इसलिए फ़ंक्शन में संदर्भ को संशोधित नहीं करता है कॉलिंग कोड में मूल्य।

2

"स्ट्रिंग वस्तु एक मान प्रकार की तरह बर्ताव जब == और! = ऑपरेटर का उपयोग करते हैं जिसका अर्थ है संदर्भ के बजाए वास्तविक वस्तु की जांच की जाती है। "

String कक्षा को इस संबंध में कोई विशेष उपचार (भाषा स्तर पर) नहीं मिलता है। कारण == और != ऑपरेटर स्ट्रिंग्स के मानों (संदर्भों के बजाए) की तुलना करते हैं क्योंकि वे ओवरलोड किए गए हैं; String.Equality Operator और String.Inequality Operator देखें।

कोई उपयोगकर्ता परिभाषित वर्ग ऑब्जेक्ट मानों पर समानता तुलना करने के लिए इन दो ऑपरेटरों को भी अधिभारित कर सकता है (हालांकि यह आमतौर पर केवल String जैसे अपरिवर्तनीय प्रकारों के लिए अनुशंसित है)।

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