2013-03-23 6 views
17

सी # structs में मूल्य प्रकार हैं, लेकिन मैं new उन्हें सक्षम कर सकता हूं जैसे कि वे संदर्भ प्रकार हैं। ऐसा क्यों है?यदि कोई संरचना एक मान प्रकार है तो मैं इसे नया क्यों कर सकता हूं?

+1

एक कन्स्ट्रक्टर वास्तव में केवल एक तरीका है जिसे प्रारंभिक माना जाने से पहले किसी ऑब्जेक्ट के साथ गड़बड़ करने का विशेष विशेषाधिकार प्राप्त होता है। – Tory

उत्तर

27

क्योंकि उनके पास रचनाकार हैं।

new operator का मतलब यह नहीं है कि "यह एक संदर्भ प्रकार है"; इसका मतलब है "इस प्रकार में एक निर्माता है"। जब आप new कुछ उदाहरण बनाते हैं, और ऐसा करने में आप एक कन्स्ट्रक्टर का आह्वान करते हैं।

उस मामले के लिए, सभी मूल्य और संदर्भ प्रकारों में रचनाकार हैं (कम से कम एक डिफ़ॉल्ट कन्स्ट्रक्टर कोई तर्क नहीं लेता है यदि प्रकार स्वयं किसी भी परिभाषित नहीं करता है)।

+0

धन्यवाद। जावा के लिए, "सभी मूल्य और संदर्भ प्रकारों में रचनाकार हैं" भी सच है? – Ben

+0

@ बेन: मैं समझता हूं कि जावा आदिम प्रकारों में भी रचनाकार हैं। – BoltClock

+0

धन्यवाद। लेकिन क्यों https://stackoverflow.com/a/47024170 'new' 'int' पर लागू नहीं हो सकता है। – Ben

3

यह एमएसडीएन दस्तावेज़ में here सही कहता है, new ऑपरेटर का उपयोग मूल्य प्रकार के डिफ़ॉल्ट कन्स्ट्रक्टर का आह्वान करने के लिए किया जाता है।

1

आपको संरचना बनाने के लिए नए ऑपरेटर का उपयोग करने की आवश्यकता नहीं है। यदि आप ऐसा करते हैं तो यह अपने कन्स्ट्रक्टर को कॉल करेगा, अगर आप सभी फ़ील्ड को असाइन नहीं किया जाएगा।

13

new ऑपरेटर का मतलब यह नहीं है कि इसका उपयोग केवल संदर्भ प्रकार के लिए किया जा सकता है। इसका उपयोग मूल्य प्रकार के साथ भी किया जा सकता है।

new Operator

वस्तुओं और आह्वान कंस्ट्रक्टर्स बनाने के लिए प्रयोग किया जाता है से।

के बाद से हर मान प्रकार परोक्ष एक सार्वजनिक डिफ़ॉल्ट निर्माता है, सभी मूल्य प्रकार मूलभूत मूल्यों है। आप Default Values Table पढ़ सकते हैं।

उदाहरण के लिए;

int i = new int(); // i will be 0 for because its default values. 

संरचना प्रकार के लिए डिफ़ॉल्ट मान;

मूल्य अशक्त को उनके डिफ़ॉल्ट मूल्यों और सभी संदर्भ प्रकार क्षेत्रों करने के लिए सभी प्रकार के मूल्य क्षेत्रों की स्थापना द्वारा उत्पादन किया।

MSDN से

इसके अलावा:

आप नए ऑपरेटर का उपयोग कर एक struct वस्तु बनाते हैं, यह बनाया जाता है और उचित निर्माता कहा जाता है। कक्षाओं के विपरीत, नए ऑपरेटर का उपयोग किए बिना structs को तत्काल किया जा सकता है। यदि आप नया उपयोग नहीं करते हैं, तो फ़ील्ड असाइन नहीं किए जाएंगे और ऑब्जेक्ट तब तक उपयोग नहीं किया जा सकता जब तक कि सभी फ़ील्ड प्रारंभ नहीं हो जाते।

+1

+1 जितनी जल्दी हो सके। शायद '(v = vs.71) 'भाग को हटा दें? –

+0

इसे सही देखें, लेकिन +2 में असमर्थ .. –

4

आप एक पूर्णांक "नया" भी कर सकते हैं।
अंतर यह है कि आप मूल्य द्वारा संदर्भ वर्ग को पास कर सकते हैं।

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

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