2009-05-17 10 views
9

संभव डुप्लिकेट:
Yield In VB.NETक्या मैं वीबीएनईटी में आईन्यूमेरेबल कार्यों के लिए उपज रिटर्न लागू कर सकता हूं?

सी # में, जब एक समारोह है कि एक IEnumerble<> रिटर्न लेखन, आप yield returnyield break; उपयोग कर सकते हैं गणना के एक आइटम लौटने के लिए और कोई शेष सूचित करने के लिए आइटम नहीं है। एक ही काम करने के लिए वीबी.नेट वाक्यविन्यास क्या है?

NerdDinner कोड से एक उदाहरण:

public IEnumerable<RuleViolation> GetRuleViolations() { 

    if (String.IsNullOrEmpty(Title)) 
     yield return new RuleViolation("Title required","Title"); 

    if (String.IsNullOrEmpty(Description)) 
     yield return new RuleViolation("Description required","Description"); 

    if (String.IsNullOrEmpty(HostedBy)) 
     yield return new RuleViolation("HostedBy required", "HostedBy"); 

    if (String.IsNullOrEmpty(Address)) 
     yield return new RuleViolation("Address required", "Address"); 

    if (String.IsNullOrEmpty(Country)) 
     yield return new RuleViolation("Country required", "Country"); 

    if (String.IsNullOrEmpty(ContactPhone)) 
     yield return new RuleViolation("Phone# required", "ContactPhone"); 

    if (!PhoneValidator.IsValidNumber(ContactPhone, Country)) 
     yield return new RuleViolation("Phone# does not match country", "ContactPhone"); 

    yield break; 
} 

यह convert C# to VB.NET tool देता है एक त्रुटि "YieldStatement असमर्थित है"।

+0

नोट। इसके अलावा, आपको वहां उपज ब्रेक की आवश्यकता नहीं है।साथ ही, आप उस कोड को फुलक प्रतिनिधियों की गणना करने के लिए नियम उल्लंघन वस्तुओं की गणना करने से रोकने के बारे में सोच सकते हैं। – yfeldblum

+0

उपज का उपयोग करके मुझे पाइपिंग की याद दिलाती है कि कॉलिंग कोड ienumerable * से पहले पुनरावृत्ति शुरू कर सकता है * ienumerable लौटने वाला फ़ंक्शन चलाना समाप्त हो गया है। बहुत ही शांत! –

+2

यह एक भयानक उदाहरण है, क्योंकि आपको इस तरह के कुछ के लिए उदारता की आवश्यकता नहीं है: नियम उल्लंघन का आकलन करने का क्या फायदा है? उन्हें एक सूची में भरें और इसके साथ किया जाए। यह कहना नहीं है कि यिल उपयोगी नहीं है, लेकिन यह सिर्फ एक बुरा उदाहरण है – piers7

उत्तर

13

वर्तमान में एक भाषा वाक्य रचना के स्तर से VB.Net में सी # की उपज वापसी करने के लिए कोई बराबर है।

हालांकि वहाँ MSDN पत्रिका में हाल ही में एक लिखने अप विधेयक मैकार्थी द्वारा कैसे VB.Net में 9,0

एक समान पैटर्न को लागू करने पर था 10
0

VB.NET में नहीं उपज वापसी :( बस एक सूची बना कर उसे वापस भेज दें।

2

अपने जवाब यहाँ देखें:

संक्षेप में:
VB.Net उपज नहीं है, लेकिन सी # एक राज्य मशीन के लिए अपने कोड में कनवर्ट करके उपज को लागू करता है उस दृश्य के पीछे। VB.Net's Static कीवर्ड आपको एक फ़ंक्शन के भीतर राज्य को स्टोर करने की अनुमति देता है, इसलिए सिद्धांत में आपको एक कक्षा को कार्यान्वित करने में सक्षम होना चाहिए जो आपको विधि के Static सदस्य के रूप में उपयोग किए जाने पर समान कोड लिखने की अनुमति देता है।

0

दृश्यों के पीछे, कंपाइलर काम करने के लिए एक गणक वर्ग बनाता है। चूंकि VB.NET इस पैटर्न को लागू नहीं है, आप IEnumerator (टी का)

0

नीचे उत्पादन देता है की अपनी खुद की कार्यान्वयन बनाने के लिए: 2, 4, 8, 16, 32

वीबी में,

Public Shared Function setofNumbers() As Integer() 

    Dim counter As Integer = 0 
    Dim results As New List(Of Integer) 
    Dim result As Integer = 1 
    While counter < 5 
     result = result * 2 
     results.Add(result) 
     counter += 1 
    End While 
    Return results.ToArray() 
End Function 

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    For Each i As Integer In setofNumbers() 
     MessageBox.Show(i) 
    Next 
End Sub 

सी # में

private void Form1_Load(object sender, EventArgs e) 
    { 
     foreach (int i in setofNumbers()) 
     { 
      MessageBox.Show(i.ToString()); 
     } 
    } 

    public static IEnumerable<int> setofNumbers() 
    { 
     int counter=0; 
     //List<int> results = new List<int>(); 
     int result=1; 
     while (counter < 5) 
     { 
      result = result * 2; 
      counter += 1; 
      yield return result; 
     } 
    } 
+2

हां, इस सरल उदाहरण के लिए, यह काम करेगा। इटरेटर्स के अन्य बेहतर उदाहरण हैं जहां आप एक ही फंक्शन कॉल के भीतर पूरी सूची बनाना नहीं चाहते हैं या नहीं कर सकते हैं। आपका सी # कोड केवल प्रत्येक मान की गणना करता है जब आप उन्हें 'foreach' लूप' के भीतर उपयोग करते हैं। जब आप 'setOfNumbers' फ़ंक्शन को कॉल करते हैं तो वीबी कोड सभी मानों की गणना करता है। यह एक महत्वपूर्ण अंतर है। – CoderDennis

8

नई Async CTP VB.NET में Yield लिए समर्थन शामिल है।

उपयोग के बारे में जानकारी के लिए Iterators in Visual Basic देखें। कि उपज नहीं लौटा रहा है, कम से कम नहीं अर्थ में कि ज्यादातर लोगों को (जिस तरह से यह हुड के होते हुए भी के तहत कार्यान्वित किया जाता है) पर वापस आ मतलब

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