Могу ли я реализовать возврат доходности для функций IEnumerable в VB.NET?[дубликат]
-
22-08-2019 - |
Вопрос
Возможный дубликат:
Доходность в VB.NET
В C# при написании функции, возвращающей IEnumerble<>
, вы можете использовать yield return
вернуть один элемент перечисления и yield break;
чтобы обозначить отсутствие оставшихся предметов.Каков синтаксис VB.NET для выполнения того же самого?
Пример из БотаникУжин код:
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;
}
Этот конвертировать C# в инструмент VB.NET выдает ошибку «YieldStatement не поддерживается».
Решение
В настоящее время в VB.Net нет эквивалента возврата доходности C# на уровне синтаксиса языка.
Однако недавно в журнале MSDN Билл Маккарти написал статью о том, как реализовать аналогичный шаблон в VB.Net 9.0.
Другие советы
Новый Асинхронный CTP включает поддержку Yield
в ВБ.НЕТ.
Видеть Итераторы в Visual Basic для получения информации об использовании.
Смотрите мои ответы здесь:
Обобщить:
В VB.Net нет доходности, но C# реализует доходность путем преобразования вашего кода в конечный автомат за кулисами.ВБ.Нет Static
Ключевое слово также позволяет вам сохранять состояние внутри функции, поэтому теоретически вы сможете реализовать класс, который позволит вам писать аналогичный код при использовании в качестве Static
член метода.
Нет возврата доходности в vb.net :( просто создайте список и верните его.
За кулисами компилятор создает класс перечислителя для выполнения этой работы.Поскольку VB.NET не реализует этот шаблон, вам необходимо создать собственную реализацию IEnumerator(Of T).
Ниже приведены результаты: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;
}
}