Posso implementare resa per IEnumerable funzioni VB.NET?[duplica]
-
22-08-2019 - |
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.
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;
}
}