我只是用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
?)
是否有任何(其他?)案例可能会优化测试代码 出?
如果是这样,我如何确保测试代码实际运行?
答案 0 :(得分:3)
它不会被优化,因为它看起来更像是什么。代码实际上更像(改编自已接受的答案here):
using (IEnumerator<Foo> iterator = CachedEnumerable.GetEnumerator())
{
while (iterator.MoveNext())
{
var d = iterator.Current;
// Other loop
}
}
编译器不知道调用MoveNext / Current是否存在副作用,因此必须调用它们。如果未使用d,则可能会优化分配。但它仍然需要调用Current。另一个循环也是如此。
所做的优化不应对您的代码产生任何逻辑影响。它会删除那些在正常条件下无效或永远不会被调用的东西。
答案 1 :(得分:1)
如果是这样,我如何确保测试代码实际运行?
您可以在单元测试项目的“属性”选项卡中禁用“优化代码”。它位于Build选项卡中。