gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:28:35 25 4
gpt4 key购买 nike

我最近了解了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/

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