क्या कोई VB.NET सी # आउट मापदंडों के बराबर है?


95

क्या VB.NET के पास C # outफ़ंक्शन पैरामीटर्स के बराबर प्रत्यक्ष है , जहां फ़ंक्शन में पारित होने वाले वेरिएबल को आरंभीकृत करने की आवश्यकता नहीं है?

जवाबों:


98

नहीं, outVB में कीवर्ड का कोई समकक्ष नहीं है ।

हालांकि, VB एक विधि में सभी स्थानीय चर को स्वचालित रूप से आरंभ करता है, इसलिए आप ByRefपहले चर को स्पष्ट रूप से आरंभ करने की आवश्यकता के बिना उपयोग कर सकते हैं ।

उदाहरण:

Sub Main()
  Dim y As Integer
  Test(y)
End Sub

Sub Test(ByRef x As Integer)
  x = 42
End Sub

(यदि आप फ्रेमवर्क में कोड की जांच करते हैं (उदाहरण के लिए Double.TryParse ), तो आप <OutAttribute>मापदंडों में जोड़ा जा सकता है , लेकिन यह तभी फर्क पड़ता है जब कॉल COM इंटरॉप या प्लेटफ़ॉर्म इनवोक के लिए marshalled हो।)


2
@Spolto: यदि आप VBScript का VB में अनुवाद कर रहे हैं, तो आपको स्पष्ट और सख्त मोड को सेट करना सुनिश्चित करना चाहिए। यह आपको अधिक त्रुटि संदेश प्राप्त करेगा, लेकिन अधिकांश समस्याओं के स्रोत को इंगित करेगा (जैसे कि प्रकार के बिना घोषित चर) माध्यमिक समस्याओं के बजाय (जैसे कि प्रकार के बिना घोषित चर बन जाता है Object, इसलिए इसका उपयोग ByRef x As Integerपैरामीटर के लिए नहीं किया जा सकता है )।
गुफ़ा

4
@Guffa: मुझे नहीं पता कि यह एक संस्करण की बात है, लेकिन मैं भी कंपाइलर चेतावनियाँ प्राप्त करता हूं जब मापदंडों के रूप में असंगठित संदर्भ प्रकार चर पारित कर रहा हूं ByRef। (यह मूल्य प्रकार के मापदंडों के साथ नहीं होता है।)
दान ताओ

4
@ दान ताओ, स्पोल्टो: यह अंतर प्रतीत होता है, मुझे संदर्भ प्रकारों के साथ एक चेतावनी भी मिलती है। मापदंडों को निर्दिष्ट करने में असमर्थता भाषा में एक सीमा है, और आपको चेतावनियों से छुटकारा पाने के लिए चर को आरंभ करना होगा। यहां तक ​​कि Nothingउन्हें असाइन करने पर चेतावनी की स्थिति से छुटकारा मिल जाएगा यह परिणाम नहीं बदलता है।
गुफ्फा

1
@ गफ्फा: हां, मैं Nothingउन्हें अब तक काम सौंप रहा हूं । जैसा कि मैंने किया है यह एक बड़ी विरासत वेबसाइट में सैकड़ों बार करने के लिए बस समय लेने वाला है। जांच के लिए धन्यवाद।
cspolton 17

3
@ मार्खर्ड: फिर डाउनवोट अन्यायपूर्ण है, क्योंकि मैंने पहले ही कवर कर लिया है कि यह Outविशेषता C # कीवर्ड के बराबर नहीं हैout
गुफ्फा

32

नहीं, इसमें कोई समकक्ष निर्माण एक गैर initialised चर एक चेतावनी के बिना एक विधि को पास करने की अनुमति देता है कि के रूप में मेरे में उल्लेख किया है, लेकिन, सवाल-जवाब एक को निर्दिष्ट <Out()>विशेषता एक पर ByRef, पैरामीटर परिभाषा हालांकि वीबी यह ध्यान नहीं देता, है सी # द्वारा इलाज एक outपैरामीटर के रूप में ।

इसलिए, मैं रेफरेंस वेरिएबल्स को प्री-इनिशियलाइज़ करूंगा Nothing और<Out()> ByRef इरादे को निर्दिष्ट करने के लिए निर्दिष्ट करूंगा (यदि सी # यूजर्स कभी आपके तरीकों को एक्सेस करते हैं तो यह काम करेगा)।

यदि आपको लगता है यदि आप जानते हैं कि जब आप डिफ़ॉल्ट का उपयोग करने का इरादा Nothingअन्यथा निर्दिष्ट नहीं किए गए संदर्भ चर में आप "चेतावनी विन्यास" सेट कर सकते हैं "का प्रयोग चर" असाइनमेंट से पहले करने के लिए कोई नहीं "" शायद परियोजना स्तर (प्रोजेक्ट गुण> संकलित पर, और आप इस सेटिंग को बदलने से पहले "सभी कॉन्फ़िगरेशन" पर कॉन्फ़िगरेशन सेट करना चाहते हैं, या, VS2015 (VB.NET 14) में, आप उपयोग कर सकते हैं #Disable Warning BC42030


3
यह महत्वपूर्ण है। मेरे पास VB उपवर्ग का एक VB उप-सदस्यता और उसके बाद C # उप-वर्ग था। C # कोड इस तथ्य को मान्यता नहीं दे रहा था कि जब तक मैं सदस्यता मानकों के आधार पर VB वर्ग में निर्दिष्ट नहीं किया गया था, उसके लिए सदस्यता विधि में अमूर्त विधियाँ पहले ही लागू हो चुकी थीं, जब तक कि मैं VB वर्ग में विशेषता लागू नहीं करता।
रिचर्ड कोलेट

@RichardCollette यह शायद मेरे जुड़े सवाल का जवाब होने के लायक है!
मार्क हर्ड

9

सी # संस्करण

  void TestFunc(int x, ref int y, out int z) {
  x++;  
  y++;
  z = 5;
}

Vb.net संस्करण

    Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
  x += 1
  y += 1 
  z = 5 
End Sub

यहां जवाब मिला

अपडेट करें

जैसा कि टिप्पणी में कहा गया है कि अपने पैरामीटर को इनिशिएट करना न भूलें जो आउट स्लॉट में उपयोग किया जाएगा


सामान्य तौर पर, मैं मानता हूं कि बायरफ सबसे बाहर की चीज है । हालाँकि, ByRef अभी भी एक चेतावनी को फेंक देगा यदि आप एक चर को अनधिकृत रूप से पास करते हैं, जैसा कि प्रश्न पूछता है।
रिचर्ड

मेरा डाउनवोट काफी समय पहले से था: जिस वेब साइट से आप जुड़े हैं, वह बहुत सामान्य है; यह विशिष्ट मुद्दों, अंतर और तकनीकी को सूचीबद्ध नहीं करता है। साथ ही आपका उत्तर अभी भी प्रश्न का उत्तर नहीं देता है।
मार्क हर्ड

1

मुझे VB.NET में समस्या थी कि मैंने एक फ़ंक्शन "Ref by" कहा, जो एक ऐरे से गुजरा।

हालांकि संकलक ने इसे एक चेतावनी के रूप में चिह्नित किया, यह ठीक था। फिक्स सुपर सरल और शायद अच्छा प्रोग्रामिंग अभ्यास है।

मैं बदल गया

Dim m_arr_values() as Integer

fnRetArray(m_arr_values)

सेवा

' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing

fnRetArray(m_arr_values)

यह तब भी मदद करता है जब चर नाम वर्णनात्मक हो तो कोडिंग ...

Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
    ...
End Sub

3
हंगेरियन नोटेशन .NET .NET डिजाइन गाइडलाइन के खिलाफ है।
22

0

आप VB.NET में संदर्भ विधि द्वारा पास का उपयोग कर सकते हैं।

आपको C # में आउट पैरामीटर मेकेनिज्म की आवश्यकता है, क्योंकि यह आपको किसी भी वेरिएबल को बिना इनिशियलाइज़ किए उपयोग नहीं करने देता है।

VB.NET को एक विशेष कीवर्ड की आवश्यकता नहीं है क्योंकि यह स्वचालित रूप से इसे स्वयं करता है।

बस ByRef का उपयोग करें।


3
यह प्रश्न का उत्तर नहीं देता है, और यह C # के संबंध में गलत है।
cspolton

Byref आपको आरंभ करने की अनुमति नहीं देता है, और आपको params मान को बदलने की अनुमति देता है। लेकिन, जैसा कि C # आउट परम के विपरीत है, यह आपको पैरामीटर को एक मूल्य के साथ आरंभीकृत करने और फ़ंक्शन में उपयोग करने के लिए अनुमति देता है, जबकि C # में आउट कीवर्ड आपको केवल एक आउट-पैरामीटर के रूप में उपयोग करने के लिए बाध्य करता है और इनपुट के रूप में नहीं। कार्यक्रम। इसके अलावा, यदि आप अपने फ़ंक्शन में इस परम के लिए कोई मूल्य नहीं बदलते हैं या सेट नहीं करते हैं, तो कंपाइलर उस त्रुटि के रूप में नहीं पकड़ पाएगा, जैसा कि C # के विपरीत है, जहां एक संकलन त्रुटि जारी की जाएगी।
पश्त्यूट

0

VB में वह विशेषता है जो C # आउट के समान होनी चाहिए लेकिन आज भी आपको इसका उपयोग करने पर भी चेतावनी मिलती है। गिथब के vblang क्षेत्र में इसे ठीक करने के बारे में विवरण हैं। https://github.com/dotnet/vblang/issues/67


-5

वेरिएबल से पहले ByRef कीवर्ड का इस्तेमाल करें ।


4
ByRefrefC # में मापदंडों के समतुल्य है , जिसे फ़ंक्शन में जाने से पहले आरंभीकृत करने की आवश्यकता होती है।
cspolton
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.