可能重复:
Yield In VB.NET
在C#中,当编写返回IEnumerble<>
的函数时,您可以使用yield return
返回枚举的单个项目,yield break;
表示没有剩余项目。做同样事情的VB.NET语法是什么?
NerdDinner代码中的示例:
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;
}
此convert C# to VB.NET tool会出现“不支持YieldStatement”错误。
答案 0 :(得分:13)
目前,从语言语法级别来看,VB.Net中没有等效的C#收益率。
然而,Bill McCarthy最近在MSDN杂志上发表了关于如何在VB.Net 9.0中实现类似模式的文章
答案 1 :(得分:8)
新的Async CTP包括对VB.NET中Yield
的支持。
有关使用情况的信息,请参阅Iterators in Visual Basic。
答案 2 :(得分:2)
在这里查看我的答案:
总结:
VB.Net没有收益,但C#通过将代码转换为场景后面的状态机来实现收益。 VB.Net的Static
关键字还允许您在函数中存储状态,因此理论上您应该能够实现一个类,当您用作方法的Static
成员时,该类允许您编写类似的代码
答案 3 :(得分:0)
VB.NET中没有收益率返回:( 只需创建一个列表并将其返回。
答案 4 :(得分:0)
在幕后,编译器会创建一个枚举器类来完成工作。由于VB.NET没有实现这种模式,你必须创建自己的IEnumerator(Of T)实现
答案 5 :(得分:0)
下面给出输出:2,4,8,16,32
在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
在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;
}
}