2008-10-30 11 views

उत्तर

1

हम्म, लगता है कि आप out of luck हो सकता है:

मैं आज एक मुद्दा के साथ संघर्ष कर रहा था जब VB.NET के लिए कुछ सी # परिवर्तित। सी # में वास्तव में एक अच्छा "उपज रिटर्न" कथन है जिसका उपयोग एमेरेटर ब्लॉक में किया जाता है ताकि गणनाकर्ता वस्तु को मूल्य प्रदान किया जा सके। वीबी.नेट में "उपज" कीवर्ड नहीं है। तो, इस के आसपास पाने के लिए कुछ समाधान हैं (जिनमें से कोई भी वास्तव में साफ नहीं है)। यदि आप लूपिंग कर रहे हैं और एक गणनाकर्ता को तोड़ना चाहते हैं और एक मान वापस करना चाहते हैं तो आप मूल्य वापस करने के लिए रिटर्न स्टेटमेंट का उपयोग कर सकते हैं। हालांकि, अगर आप पूरी गणना वापस करना चाहते हैं, तो बच्चे के प्रकार की एक सूची() बनाएं और सूची वापस करें। चूंकि आप आमतौर पर इसे एक आईनेमरेबल के साथ उपयोग कर रहे हैं, इसलिए सूची() अच्छी तरह से काम करेगी।

एक साल पहले लिखा गया था कि, यकीन नहीं करता है, तो किसी को भी कुछ और तब से बेहतर साथ आ गया है ..


संपादित करें: इस VB.NET के 11 संस्करण में संभव हो जाएगा (वीएस -2010 के बाद एक), इटरेटर के लिए समर्थन की योजना बनाई गई है। Spec is available here

2

वीबीएनईटी कस्टम इटरेटर्स के निर्माण का समर्थन नहीं करता है और इस प्रकार सी # उपज कीवर्ड के बराबर नहीं है। हालांकि, आप अधिक जानकारी के लिए केबी आलेख How to make a Visual Basic .NET or Visual Basic 2005 class usable in a For Each statement पर देखना चाहेंगे।

1

सी # की उपज कीवर्ड संकलक को पृष्ठभूमि में राज्य मशीन बनाने के लिए मजबूर करता है ताकि इसका समर्थन किया जा सके। वीबी.Net में उपज कीवर्ड नहीं है। लेकिन इसमें एक ऐसा निर्माण है जो आपको फ़ंक्शन के भीतर एक राज्य मशीन बनाने की अनुमति देगा: Static function members

एक जेनेरिक क्लास बनाकर उपज रिटर्न फ़ंक्शन के प्रभावों की नकल करना संभव होना चाहिए जो आईन्यूमेरेबल के साथ-साथ आवश्यक राज्य मशीन लागू करता है और आपके फ़ंक्शन के अंदर एक स्थिर सदस्य के रूप में एक उदाहरण रखता है।

यह निश्चित रूप से, कार्य के बाहर कक्षा को कार्यान्वित करने की आवश्यकता होगी। लेकिन अगर सही तरीके से किया जाता है तो कक्षा सामान्य मामले में फिर से प्रयोग योग्य होनी चाहिए। हालांकि, मैंने कोई कार्यान्वयन विवरण प्रदान करने के लिए पर्याप्त विचार के साथ नहीं खेला है।

+0

हे जोएल, आपने कम से कम दो बार इस विचार का उल्लेख किया है। फैंसी आपके विचार को आगे बढ़ा रहा है? –

+0

मैंने इसे थोड़ा गहराई से देखा है, और मुझे अब यकीन नहीं है कि आप एक ही प्रकार की स्टेट मशीन बना सकते हैं जैसे सी # के उपज कीवर्ड VB.Net स्टेटिक स्थानीय चर में। ऐसा नहीं है कि यह असंभव होगा, लेकिन यह निश्चित रूप से तुच्छ नहीं होगा और अंत में आपको मशीन को असाइन करने के लिए कुछ अजीब कोड लिखना होगा। यहां तक ​​कि आप दृश्य स्टूडियो 2005 में भी नहीं कर सके, क्योंकि इसे लैम्ब्डा अभिव्यक्तियों की आवश्यकता होगी। –

4

मुझे अभी भी इस अवधारणा के आसपास अपना सिर मिल रहा है। आलेख Use Iterators in VB Now हाल ही में विजुअल स्टूडियो पत्रिका में प्रकाशित किया गया था।

+0

लिंक टूटा हुआ है! – Peter

-4

नीचे उत्पादन देता है: 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; 
    } 
} 
0

ध्यान रखें कि LINQ expresssions की आस्थगित निष्पादन और आलसी मूल्यांकन गुण और विधियों हमें प्रभावी रूप से कस्टम iterators को लागू करने के लिए जब तक उपज बयान .NET 4.5 में उपलब्ध है अनुमति देते हैं। यील्ड का उपयोग LINQ अभिव्यक्तियों और विधियों द्वारा आंतरिक रूप से किया जाता है।

निम्नलिखित कोड यह दर्शाता है।

Private Sub AddOrRemoveUsersFromRoles(procName As String, 
             applicationId As Integer, 
             userNames As String(), 
             rolenames As String()) 
    Dim sqldb As SqlDatabase = CType(db, SqlDatabase) 
    Dim command As DbCommand = sqldb.GetStoredProcCommand(procName) 
    Dim record As New SqlDataRecord({New SqlMetaData("value", SqlDbType.VarChar,200)}) 
    Dim setRecord As Func(Of String, SqlDataRecord) = 
     Function(value As String) 
      record.SetString(0, value) 
      Return record 
     End Function 
    Dim userNameRecords As IEnumerable(Of SqlDataRecord) = userNames.Select(setRecord) 
    Dim roleNameRecords As IEnumerable(Of SqlDataRecord) = rolenames.Select(setRecord) 
    With sqldb 
     .AddInParameter(command, "userNames", SqlDbType.Structured, userNameRecords) 
     .AddInParameter(command, "roleNames", SqlDbType.Structured, roleNameRecords) 
     .AddInParameter(command, "applicationId", DbType.Int32, applicationId) 
     .AddInParameter(command, "currentUserName", DbType.String, GetUpdatingUserName) 
     .ExecuteNonQuery(command) 
    End With 
End Sub 
संबंधित मुद्दे