gpt4 book ai didi

c# - 禁用循环返回值的 C# 优化

转载 作者:太空狗 更新时间:2023-10-30 00:40:37 25 4
gpt4 key购买 nike

我有一个返回 IEnumerable<T> 的方法.我从两个地方调用这个方法,在其中一个地方我不对结果做任何事情。

看起来 C# 编译器删除了对该方法的调用,即使我用 [MethodImpl(MethodImplOptions.NoOptimization)] 修饰它也是如此.代码甚至没有进入调用方法。如果我添加 .ToList()但最后,它被执行了。

有没有办法通过编译器/运行时禁用此优化?查看 ILDASM 输出,它看起来更像是运行时优化,因为调用就在那里。

最佳答案

It looks like the C# compiler removes the call to that method

不,它不是 - 这正是迭代器 block 的工作方式。迭代器 block 中的代码只会在第一次调用 MoveNext() 时开始执行。如果你想确保整个方法得到执行,你可以使用:

SomeIteratorMethod().Count();

这将遍历整个序列,丢弃结果(而不是调用 ToList,例如,它将

如果你只想得到第一个yield语句,你可以使用

SomeIteratorMethod().Any();

如果您希望一些代码始终执行(例如参数验证)但其余代码应该是惰性的,您需要将方法拆分为两个方法:

public IEnumerable<Foo> SomeIteratorMethod(string mustNotBeNull)
{
if (mustNotBeNull == null)
{
throw ...
}
return SomeIteratorMethodImpl(mustNotBeNull);
}

private IEnumerable<Foo> SomeIteratorMethodImpl(string mustNotBeNull)
{
... yield new Foo()...
}

当然,您也可以停止使用迭代器 block 。

关于c# - 禁用循环返回值的 C# 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26160853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com