2012-02-09 13 views
28

मैंने अभी विजुअल स्टूडियो 2010 सर्विस पैक (विंडोज अपडेट पर प्रस्तावित) स्थापित किया है, और मैं "इंटेलिजेंस" पर एक नई सुविधा देख सकता हूं जिसका मतलब है कि जब मैं Function या Sub VB.NET में लिखता हूं तो यह स्वतः पूर्ण पैरामीटर नहीं करता है ByRef या ByVal ...अब ByVal/ByRef को इंगित करना क्यों आवश्यक नहीं है?

1) क्या वैसे भी है कि मैं इस विकल्प को पहले से कैसे कॉन्फ़िगर कर सकता हूं?

2) यदि मैं ByX निर्दिष्ट नहीं करता, तो डिफ़ॉल्ट रूप से किस का उपयोग किया जाता है? (ऐसा लगता है यह हमेशा ByRef है) की तरह

+2

डिफ़ॉल्ट 'ByVal' है, लेकिन सुनिश्चित करें कि आप समझते हैं कि [मूल्य और संदर्भ द्वारा गुजरना] (http://msdn.microsoft.com/en-us/library/ddck1z30.aspx) वास्तव में इसका मतलब है। –

+9

आप लगभग हमेशा 'ByVal' पास करना चाहते हैं, और यह वास्तव में डिफ़ॉल्ट है। इस जगह पर 'ByVal' के साथ कोड को अव्यवस्थित करने का कोई कारण नहीं है; यह सिर्फ "शोर" है। जब आप बिल्कुल पास-बाय-रेफरेंस अर्थशास्त्र प्राप्त करते हैं तो केवल 'ByRef' को स्पष्ट रूप से निर्दिष्ट करें। –

उत्तर

17

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

Public Sub (Something As WhateverClass) 
    Something = New WhateverClass 'will result in no changes when outside this method 

    Something.Property1 = "Test" 'will result in an updated property when outside this method 
End Sub 

द्वारा करने के लिए दोषी होने के लिए MSDN से:

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

+0

यह उत्तर भ्रामक है क्योंकि यह बताता है कि "संदर्भ प्रकार का मूल्य कैसे काम करता है" जबकि सवाल यह है कि "बायवल/बाय्रफ को इंगित करना क्यों आवश्यक नहीं है?" – mchar

31

ऐसा लगता है कि इस पोस्ट में अपने प्रश्न को शामिल किया गया:

http://msmvps.com/blogs/carlosq/archive/2011/03/15/vs-2010-sp1-changing-quot-byval-quot-vb-net-code-editor-experience.aspx

तो नहीं, पुराने व्यवहार प्राप्त करने के लिए कोई रास्ता नहीं है। अब से ByVal डिफ़ॉल्ट है (यह पहले क्या था) और यह विधि पैरामीटर में स्वचालित रूप से जोड़ा नहीं जाएगा।

मेरी राय में यह एक अच्छा निर्णय है क्योंकि यह VB.NET को सी # के साथ थोड़ा अधिक संगत बना रहा है और अनावश्यक "शोर" से बचाता है (यह पहले से ही वर्बोज़ पर्याप्त है)।

पुराने व्यवहार:

Private Sub test(ByVal test As String) 
End Sub 

नई व्यवहार

Private Sub test(test As String) 
End Sub 
+0

संक्षेप में और सीधे बिंदु के जवाब पर, अच्छी तरह से किया गया! – mchar

8

खबरदार जब VBA, जहां डिफ़ॉल्ट ByRef है दिनचर्या के हस्तांतरण (देखें, उदाहरण, the bottom of this page पर, महान चिप पियर्सन द्वारा "पैरामीटर पासिंग के डिफ़ॉल्ट विधि")। यह गंदा हो सकता है।

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