我正在尝试将tdd与nunit进行比较,并且针对CachedEnumerable< T>编写了以下测试类:
[Test]
public void CanNestEnumerations()
{
var SourceEnumerable = Enumerable.Range(0, 10).Select(i => (decimal)i);
var CachedEnumerable = new CachedEnumerable<decimal>(SourceEnumerable);
Assert.DoesNotThrow(() =>
{
foreach (var d in CachedEnumerable)
{
foreach (var d2 in CachedEnumerable)
{
}
}
});
}
>是否会优化嵌套的for循环,因为它们不会这样做
什么(循环后再也不会使用CachedEnumerable)?
>是否有其他情况可以优化测试代码
出来吗
>如果是这样,我如何确保测试代码实际运行?
解决方法:
它不会被优化,因为还有更多的事情在进行.该代码实际上更像(改编自已接受的答案here):
using (IEnumerator<Foo> iterator = CachedEnumerable.GetEnumerator())
{
while (iterator.MoveNext())
{
var d = iterator.Current;
// Other loop
}
}
编译器不知道调用MoveNext / Current是否有副作用,因此必须调用它们.如果不使用d,则可能会优化分配.但是它仍然必须调用Current.另一个循环也是如此.
所做的优化不应对您的代码产生任何逻辑影响.它只会删除无效或在正常情况下永远不会被调用的内容.