如何解决迭代器块中的“屈服中断”和“中断”之间有何区别?
我在 Enumerable.cs 中看到了这样的内容:
private static IEnumerable<TSource> TakeWhileIterator<TSource>(
IEnumerable<TSource> source,Func<TSource,bool> predicate)
{
foreach (TSource source1 in source)
{
if (predicate(source1))
yield return source1;
else
break; // break
}
}
所以我写这样的东西:
private static IEnumerable<TSource> TakeWhileIteratorWithYield<TSource>(
IEnumerable<TSource> source,bool> predicate)
{
foreach (TSource source1 in source)
{
if (predicate(source1))
yield return source1;
else
yield break; // yield break
}
}
我尝试了这两种方法,似乎它们具有完全相同的功能。
因此,我去SharpLab并反编译这些代码。
我认为主要区别在于MoveNext()
,如下所示:
无收益
private bool MoveNext()
{
try
{
switch (_state)
{
default:
return false;
case 0:
_state = -1;
_s__1 = source.GetEnumerator();
_state = -3;
break;
case 1:
_state = -3;
_source5__2 = default(TSource);
break;
}
// From Here
if (_s__1.MoveNext())
{
_source5__2 = _s__1.Current;
if (predicate(_source5__2))
{
_current = _source5__2;
_state = 1;
return true;
}
}
Finally1();
_s__1 = null;
return false;
// To Here
}
catch
{
//try-fault
((IDisposable) this).Dispose();
throw;
}
}
产量
private bool MoveNext()
{
try
{
switch (_state)
{
default:
return false;
case 0:
_state = -1;
_s__1 = source.GetEnumerator();
_state = -3;
break;
case 1:
_state = -3;
_source5__2 = default(TSource);
break;
}
// From Here
if (!_s__1.MoveNext())
{
Finally1();
_s__1 = null;
return false;
}
_source5__2 = _s__1.Current;
if (predicate(_source5__2))
{
_current = _source5__2;
_state = 1;
return true;
}
bool result = false;
Finally1();
return result;
// To Here
}
catch
{
//try-fault
((IDisposable) this).Dispose();
throw;
}
}
我看不到它们之间的功能差异。
有人可以告诉我迭代器块中break
和yield break
之间的区别吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。