Domanda

Possibile Duplicare:
Resa In VB.NET

In C#, durante la scrittura di una funzione che restituisce un IEnumerble<>, è possibile utilizzare yield return per restituire un singolo elemento dell'enumerazione e yield break; per significare nessun restanti elementi.Qual è il VB.NET la sintassi per fare la stessa cosa?

Un esempio NerdDinner codice:

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

Questo convert C# a VB.NET strumento dà un "YieldStatement non è supportato" errore.

È stato utile?

Soluzione

Non ci sono attualmente pari a rendimento ritorno C # 's in VB.Net da un livello sintassi del linguaggio.

Tuttavia c'era un recente scrittura in rivista MSDN da Bill McCarthy su come implementare un modello simile in VB.Net 9.0

Altri suggerimenti

Il nuovo Async CTP include il supporto per Yield in VB.NET .

Iteratori in Visual Basic per informazioni sull'utilizzo.

Vedere le mie risposte qui:

Per riassumere:
VB.Net non dispone di resa, ma il C# implementa rendimento di conversione di codice per una macchina dietro che scene.VB.Net's Static parola chiave consente inoltre di memorizzare stato all'interno di una funzione, quindi in teoria si dovrebbe essere in grado di implementare una classe che consente di scrivere codice simile quando viene utilizzato come un Static membro di un metodo.

Nessun ritorno resa in VB.NET :( Basta creare un elenco e restituirlo.

Dietro le quinte, il compilatore crea una classe enumeratore per fare il lavoro. Dal momento che VB.NET non implementa questo modello, è necessario creare una propria implementazione di IEnumerator (Of T)

Questi spedisce uscita: 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;
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top