gpt4 book ai didi

c# - IEnumerable 现在是否比 IReadOnlyList 更防水?

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

我读过这个问题:IEnumerable vs IReadonlyCollection vs ReadonlyCollection for exposing a list member这个问题:ReadOnlyCollection or IEnumerable for exposing member collections? .我知道这些答案是几年前写的。

Jon Skeet 的回答建议我应该使用 IReadOnlyCollection 而不是 IEnumerable,因为我非常谨慎地防止这样的代码:

ICollection<Order> evil = (ICollection<Order>)customer.Orders;
evil.Add(order3);

现在看下面的代码:

public class Customer
{
private readonly List<Order> _orders = new List<Order>();

public string FirstName { get; set; }
public string LastName { get; set; }
public IEnumerable<Order> Orders
{
get { foreach (var order in _orders) yield return order; }
}

internal void AddOrder(Order order)
{
_orders.Add(order);
}

public void AddOrders(IEnumerable<Order> orders)
{
this._orders.AddRange(orders);
}
}

我可以这样使用代码:

Order order1 = new Order();
Order order2 = new Order();
Order order3 = new Order();

Customer customer = new Customer();
customer.FirstName = "Fred";
customer.LastName = "Bloggs";
customer.AddOrder(order1);
customer.AddOrder(order2);

像这样:

Customer customer2 = new Customer();
customer2.FirstName = "Average";
customer2.LastName = "Joe";

List<Order> orders = new List<Order>();
Order order4 = new Order();
Order order5 = new Order();
orders.Add(order4);
orders.Add(order5);
customer2.AddOrders(orders);

使用此代码有任何风险吗?我试图让它尽可能防水,因为它是公共(public) api 的一部分。这比 IReadOnlyCollection 更防水吗?效率低吗?请注意,这是代码的最终版本,因此没有其他情况需要考虑。

我担心的是:

  1. 公开 IEnumerable 而不是只读列表。

  2. 使用列表来私下保存订单。

我正在尽力遵循此处描述的建议:https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/guidelines-for-collections .

最佳答案

Is this more water tight than an IReadOnlyCollection?

我不这么认为。我会说它们以另一种方式服务于相同的目的。

Are there any risks using this code? Is it less efficient?

风险?不是我知道的。由于 yield return 编译为内部状态机,因此您无法直接公开列表。这是您的方法的一个好处,就像只读集合一样。

您的代码确实对性能有影响:获取计数和其他相关属性的复杂度为 O(n) 而不是 O(1)。这可能会影响您的表现。

关于c# - IEnumerable 现在是否比 IReadOnlyList 更防水?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49857408/

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