gpt4 book ai didi

c# - 在设计公共(public) API 时,我们应该避免将 IEnumerable 作为输入吗?

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

考虑以下示例。

假设我开发了一个将由第三方使用的库。该库有一个接受 IEnumerable 的方法,这很好,因为它从传递的集合的实现中抽象出来。但是,当我检索输入参数时,会发生惰性求值。

public interface IStorage<in T>
{
void Store(IEnumerable<T> values);
}

public class FileStorage<T> : IStorage<T>
{
public void Store(IEnumerable<T> values)
{
foreach (var value in values) { /*Evaluation of IEnumerable*/}
}
}

一些客户通过以下方式使用我的库:

  IEnumerable<int> values;
try
{
values = new[] { "1", "2", "three" }.Select(int.Parse);
}
catch (Exception)
{
values = Enumerable.Empty<int>();
}

var storage = new FileStorage<int>();
storage.Store(values);

这将导致 Store 内部出现异常评估发生的方法。如果我设计了 Store服用方法List<T>我确定它是安全可枚举的 Ts 集合。问题是我们应该避免IEnumerable吗?在设计 API 时,或者我们是否应该在需要时在安全上下文中允许和枚举它,因为它可能会引发异常。

最佳答案

根据 Krzysztoc Cwalina 和 Brad Adams 的框架设计指南一书。

http://blogs.msdn.com/b/kcwalina/archive/2008/01/03/frameworkdesignguidelines2ndedition.aspx

建议你做...

摘自第 252 页 (8.3.1)

Collection Parameters

DO use the least-specialized type possible as a parameter type. Most members taking collections as parameters use the IEnumerable interface

 public void PrintNames(IEnumerable<string> names) {
foreach(string name in names) {
Console.WriteLine(name);
} }

AVOID using ICollection or ICollection as a parameter just to access the Count property.

Instead consider IEnumerable or IEnumerable and dynamically checking whether the object implements ICollection or ICollection

顺便说一句,这是一本很棒的书,值得一读,目前真的很喜欢。附言写这篇文章的人帮助编写了 .NET 框架

关于c# - 在设计公共(public) API 时,我们应该避免将 IEnumerable 作为输入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11567308/

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