c# - Resharper 从 foreach 中移除了 yield。为什么?

标签 c# resharper yield-return

我最近了解了yield,然后创建了以下测试控制台程序:

    public static string Customers = "Paul,Fred,Doug,Mark,Josh";
    public static string Admins = "Paul,Doug,Mark";

    public static void Main()
    {
        var test = CreateEfficientObject();

        Console.WriteLine(test.Admins.FirstOrDefault());
        //Note that 'GetAllCustomers' never runs. 
    }

    public static IEnumerable<string> GetAllCustomers()
    {
        var databaseFetch = Customers.Split(',');
        foreach (var s in databaseFetch)
        {
            yield return s;
        }
    }

    public static IEnumerable<string> GetAllAdmins()
    {
        var databaseFetch = Admins.Split(',');
        foreach (var s in databaseFetch)
        {
            yield return s;
        }
    }

    static LoginEntitys CreateEfficientObject()
    {
        var returnObject = new LoginEntitys {};
        returnObject.Admins = GetAllAdmins();
        returnObject.Customers = GetAllCustomers();
        return returnObject;
    }
}
public class LoginEntitys
{
    public IEnumerable<String> Admins { get; set; }
    public IEnumerable<String> Customers { get; set; }
}

但我注意到 Resharper 想要将我的 foreach 循环转换为:

public static IEnumerable<string> GetAllCustomers()
{
    var databaseFetch = Customers.Split(',');
    return databaseFetch;
}

为什么 Resharper 想要从这种情况中删除 yield ?它完全改变了功能,因为它将不再在没有 yield 的情况下延迟加载。我只能猜测要么

  • A) 我使用 yield 不正确/操作不当
  • B) 这是一个可以忽略的 Resharper 错误/建议。

任何见解都会很棒。

最佳答案

你是对的,这个提议的转换以微妙的方式改变了代码的功能,防止它推迟对属性的评估和执行 Split 以提前评估。

也许那些实现它的人很清楚这是一个功能上的变化,并认为它仍然是一个有用的建议,如果现有的语义很重要,或者如果他们实际上没有意识到语义是可以忽略的正在被改变。我们没有很好的方法知道,我们只能猜测。如果这些语义对您的程序很重要,那么您不进行建议的转换是正确的。

关于c# - Resharper 从 foreach 中移除了 yield。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25514736/

相关文章:

c# - 树木修剪性能不佳

c# - 如何修复winform中的 "inaccessible due to its protection level"错误?

c# - Visual Studio 2010 : Add new class file that inherits from existing class?

c# - 对于 R# 对精度损失的提示,这是一个很好的解决方案吗?

c# - 编译为空的虚拟 IEnumerable<T>

c# - 使用 yield 时在 try/catch 中包装对迭代器的调用

c# - 在 flowLayout 中的控件之间设置更多空间

c# - Linq复制/复制整个记录

c# - Resharper 和 Productivity Power Tools 争夺我的使用权。我怎样才能停止流血?

c# - 消耗 IEnumerable 生成的序列