Posso implementar retorno de rendimento para as funções IEnumerable em VB.NET? [duplicado]
-
22-08-2019 - |
Pergunta
Duplicate possíveis:
Rendimento Em VB.NET
Em C #, quando se escreve uma função que retorna um IEnumerble<>
, você pode usar yield return
para retornar um único item da enumeração e yield break;
para significar não tem itens restantes. O que é a sintaxe VB.NET para fazer a mesma coisa?
Um exemplo do href="http://nerddinnerbook.s3.amazonaws.com/Part3.htm" rel="nofollow noreferrer"> NerdDinner código :
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;
}
Este convertido C # para VB.NET ferramenta dá uma "YieldStatement não é suportado" erro.
Solução
Atualmente, não há equivalente ao retorno de rendimento do C # no VB.Net a partir de um nível de sintaxe da linguagem.
No entanto, houve uma gravação recente em revista MSDN por Bill McCarthy sobre como implementar um padrão semelhante em VB.Net 9.0
Outras dicas
Veja minhas respostas aqui:
Para resumir:
não VB.Net não tem rendimento, mas C # implementos deu através da conversão de seu código para uma máquina de estado por trás disso cenas. de VB.Net chave Static
também permite que você estado loja dentro de uma função, por isso, em teoria, você deve ser capaz de implementar uma classe que permite escrever código semelhante quando usado como um membro Static
de um método.
Sem rendimento retorno em VB.NET :( Basta criar uma lista e devolvê-lo.
Nos bastidores, o compilador cria uma classe enumerador para fazer o trabalho. Desde VB.NET não implementa este padrão, você tem que criar sua própria implementação de IEnumerator (Of T)
A seguir dá saída: 2, 4, 8, 16, 32
Em 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
Em 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;
}
}