Frage

  

Mögliche Duplizieren:
   Yield In VB.NET

In C #, wenn eine Funktion zu schreiben, die eine IEnumerble<> zurückgibt, können Sie yield return verwenden, um ein einzelnes Element der Aufzählung und yield break; zurückzukehren keine verbleibenden Elemente bedeuten. Was ist die VB.NET-Syntax, die gleiche Sache zu tun?

Ein Beispiel aus der NerdDinner Code:

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;
}

Das C # VB.NET-Tool zu konvertieren a gibt "YieldStatement wird nicht unterstützt" Fehler.

War es hilfreich?

Lösung

Es gibt derzeit keine Entsprechung zu C # 's Ertrag Rückkehr in VB.Net aus einer Sprachsyntax Ebene.

Allerdings gab es eine kürzlich in MSDN Magazin von Bill McCarthy schreibt auf, wie ein ähnliches Muster in VB.Net 9.0

implementieren

Andere Tipps

Der neue Async CTP Unterstützung für Yield enthält in VB.NET .

Siehe Iteratoren in Visual Basic Informationen zur Verwendung.

Sehen Sie meine Antworten hier:

Um es zusammenzufassen:
VB.Net nicht über Ausbeute, aber C # implementiert Ausbeute von Ihrem Code zu einer Zustandsmaschine Umwandlung hinter diesen Szenen. VB.Net des Static Schlüsselwort ermöglicht es Ihnen auch zu speichern Zustand innerhalb einer Funktion, so in der Theorie sollte es möglich sein, eine Klasse zu implementieren, die Sie ähnlichen Code schreiben können, wenn sie als Static Mitglied einer Methode verwendet wird.

Keine yield return in VB.NET :( Erstellen Sie einfach eine Liste und gibt es zurück.

Hinter den Kulissen, erzeugt der Compiler eine Enumerator-Klasse die Arbeit zu tun. Da VB.NET dieses Muster nicht implementiert, müssen Sie Ihre eigene Implementierung von IEnumerator erstellen (Of T)

Im Folgenden gibt Ausgang: 2, 4, 8, 16, 32

In VB

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

In C #

   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;
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top