संदर्भ प्रकारों और मूल्य प्रकारों के बीच का अंतर मूल रूप से भाषा के डिजाइन में एक प्रदर्शन व्यापार है। निर्माण और विनाश और कचरा संग्रह पर संदर्भ प्रकार कुछ ओवरहेड हैं, क्योंकि वे ढेर पर बनाए गए हैं। दूसरी ओर वैल्यू टाइप्स मेथड कॉल्स पर ओवरहेड होते हैं (यदि डेटा का आकार एक पॉइंटर से बड़ा है), क्योंकि पूरे ऑब्जेक्ट को केवल पॉइंटर के बजाय कॉपी किया जाता है। क्योंकि तार एक पॉइंटर के आकार से बहुत बड़े (और आमतौर पर) हो सकते हैं, उन्हें संदर्भ प्रकारों के रूप में डिज़ाइन किया गया है। इसके अलावा, जैसा कि Servy ने बताया, एक मूल्य प्रकार का आकार संकलन समय पर ज्ञात होना चाहिए, जो हमेशा स्ट्रिंग के लिए नहीं होता है।
उत्परिवर्तन का प्रश्न एक अलग मुद्दा है। संदर्भ प्रकार और मूल्य प्रकार दोनों परस्पर या अपरिवर्तनीय हो सकते हैं। मूल्य प्रकार आमतौर पर अपरिवर्तनीय होते हैं, क्योंकि उत्परिवर्ती मूल्य प्रकारों के लिए शब्दार्थ भ्रमित हो सकते हैं।
संदर्भ प्रकार आम तौर पर परिवर्तनशील होते हैं, लेकिन इसे समझ में आने पर अपरिवर्तनीय के रूप में डिजाइन किया जा सकता है। स्ट्रिंग्स को अपरिवर्तनीय के रूप में परिभाषित किया जाता है क्योंकि यह कुछ अनुकूलन को संभव बनाता है। उदाहरण के लिए, यदि एक ही स्ट्रिंग शाब्दिक एक ही प्रोग्राम (जो कि काफी सामान्य है) में कई बार होता है, तो कंपाइलर उसी ऑब्जेक्ट का पुन: उपयोग कर सकता है।
तो पाठ द्वारा तार की तुलना करने के लिए "==" क्यों अतिभारित है? क्योंकि यह सबसे उपयोगी शब्दार्थ है। यदि दो तार पाठ के बराबर हैं, तो वे अनुकूलन के कारण समान वस्तु संदर्भ हो सकते हैं या नहीं भी हो सकते हैं। इसलिए तुलनात्मक संदर्भ बहुत बेकार हैं, जबकि पाठ की तुलना लगभग हमेशा होती है जो आप चाहते हैं।
अधिक सामान्यतः बोलते हुए, स्ट्रिंग्स के पास मूल्य शब्दार्थ है । यह मूल्य प्रकारों की तुलना में अधिक सामान्य अवधारणा है, जो कि C # विशिष्ट कार्यान्वयन विवरण है। मान प्रकार में मूल्य शब्दार्थ होते हैं, लेकिन संदर्भ प्रकार में मान शब्दार्थ भी हो सकते हैं। जब एक प्रकार का मूल्य शब्दार्थ होता है, तो आप वास्तव में यह नहीं बता सकते हैं कि अंतर्निहित कार्यान्वयन एक संदर्भ प्रकार या मूल्य प्रकार है, इसलिए आप विचार कर सकते हैं कि कार्यान्वयन विस्तार।
is
परीक्षणों को छोड़कर ) है, इसका उत्तर संभवतः "ऐतिहासिक कारणों से" है। नकल का प्रदर्शन इसका कारण नहीं हो सकता क्योंकि शारीरिक रूप से अपरिवर्तनीय वस्तुओं की नकल करने की कोई आवश्यकता नहीं है। अब बिना ब्रेकिंग कोड को बदलना असंभव है जो वास्तव मेंis
चेक (या समान बाधाओं) का उपयोग करता है।