测试可能被优化掉的代码

3

我只是在尝试使用 ,并编写了以下测试,针对我的 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)
                {

                }
            }
        });
}
  1. 嵌套的for循环会被优化掉吗?因为它们什么也没做(在循环之后,CachedEnumerable从未被使用)。

  2. 还有没有其他情况下,测试代码可能会被优化掉?

  3. 如果是这样,我该如何确保测试代码实际运行?

2个回答

3

这段代码不会被优化掉,因为它实际上做的事情比看上去的更多。实际上,这段代码更像是以下代码(改编自这里的已接受答案):

using (IEnumerator<Foo> iterator = CachedEnumerable.GetEnumerator())
{
    while (iterator.MoveNext())
    {
        var d = iterator.Current;

        // Other loop
    }
}

编译器不知道调用MoveNext/Current是否有副作用,因此必须调用它们。如果未使用d,则可能会优化掉赋值语句。但仍需调用Current。其他循环同理。
所做的优化对您的代码不应产生任何逻辑影响。它只会删除没有效果或在正常条件下永远不会被调用的东西,以及其他一些东西。

我认为我有答案了,“所做的优化对您的代码不应该产生任何逻辑影响。” 不应该,还是不会? - George Duckett
@George - 没有什么是确定的,这就是为什么我说“不应该”。我可以说,在我长期使用C#/.NET的过程中,我从未遇到过优化问题。 - CodeNaked

1
如果是这样,我怎么才能确保测试代码实际运行呢?
您可以在单元测试项目的属性选项卡中禁用“优化代码”。它在“生成”选项卡中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接