gpt4 book ai didi

c# - 在这种情况下使用 yield 有什么好处吗?

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

我在维护一些代码,原作者不在了,所以我想在这里问一下,看看能不能满足我的好奇心。

下面是一些使用 yield 的代码(匿名)。据我所知,它不会增加任何好处,只需返回一个列表就足够了,也许也更具可读性(至少对我而言)。只是想知道我是否遗漏了什么,因为这种模式在代码库的几个地方重复出现。

public virtual IEnumerable<string> ValidProductTypes
{
get
{
yield return ProductTypes.Type1;
yield return ProductTypes.Type2;
yield return ProductTypes.Type3;
}
}

此属性用作某些类的参数,该类仅使用它来填充集合:

var productManager = new ProductManager(ValidProductTypes);

public ProductManager(IEnumerable<string> validProductTypes)
{
var myFilteredList = GetFilteredTypes(validProductTypes);
}

public ObservableCollection<ValidType> GetFilteredTypes(IEnumerable<string> validProductTypes)
{
var filteredList = validProductTypes
.Where(type => TypeIsValid); //TypeIsValid returns a ValidType
return new ObservableCollection<ValidType>(filteredList);
}

最佳答案

我会说返回 IEnumerable<T>并使用 yield return 实现它是最简单选项。

如果您看到某个方法返回 IEnumerable<T> ,你真的只能用它做一件事:迭代它。对它的任何更复杂的操作(比如使用 LINQ)只是封装了迭代它的特定方法。

如果一个方法返回一个数组或列表,您还可以获得改变它的能力,您可能会开始怀疑这是否是 API 可接受的用法。例如,如果您执行 ValidProductTypes.Add("a new product") 会发生什么? ?

如果您只是在谈论实现,那么差异就会小得多。但是调用者仍然可以从 IEnumerable<T> 转换返回的数组或列表。到它的具体类型并改变它。任何人实际上认为这是 API 的预期用途的可能性很小,但是 yield return ,机会为零,因为这是不可能的。

考虑到我会说语法具有大致相同的复杂性和易于理解,我认为 yield return是一个合理的选择。尽管使用 C# 6.0 表达式主体属性,数组的语法可能会占上风:

public virtual IEnumerable<string> ValidProductTypes =>
new[] { ProductTypes.Type1, ProductTypes.Type2, ProductTypes.Type3 };

以上答案假设这不是性能关键代码,因此性能上的相当小的差异无关紧要。如果这是性能关键代码,那么您应该衡量哪个选项更好。您可能还想考虑摆脱分配(可能通过将数组缓存在一个字段中,或类似的方式),这可能是主要因素。

关于c# - 在这种情况下使用 yield 有什么好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46125138/

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