使用ICollection而不是List



我有一个外部方法,它返回List<IPAddress>

我在我的类中写了另一个方法,它是这个方法的包装器。但我被告知不要返回List<>,而是返回IListICollection。现在我有什么:

MyClass obj = new MyClass();
List<IPAddress> addr = obj.GetAddr();//GetAddr() now return `List`,but should be changed to return ILIst or ICollection

我该怎么做——选角?

上升我照你说的做了,得到了一个错误r"不能隐式地将Ilst转换为List"(它是.net 4.5)

他/她可能的意思是:将列表返回为IList<T>ICollection<T>

为了做到这一点,只需更改方法的签名并像往常一样返回列表:

public ICollection<T> Method(){
    MyClass obj = new MyClass();
    List<IPAddress> addr = obj.GetAddr();
    return addr;
}

这是为了避免将客户端绑定到具体的List<T>实现。

通过返回更抽象的东西,比如ICollection<T>,甚至IEnumerable<T>,如果以后决定在内部使用HashSet<T>而不是List<T>,就不会遇到任何问题。签名和客户代码将保持不变。

您可以将方法返回类型更改为IList<IPAddress>IEnumerable<IPAddress>,如:

public IList<IPAddress> GetAddress()
{
    return new List<IPAddress>(); //replace with your code to return list
}
public IEnumerable<IPAddress> GetAddress()
{
    return new List<IPAddress>(); //replace with your code to return list
}

只需更改方法的返回值。由于List可以隐式转换为两个接口,因此不需要任何强制转换。

如果obj.GetAddr()返回IList<IPAddress>ICollection<IPAddress>IEnumerable<IPAddress>,则只需将.ToList()添加到作业末尾即可:

List<IPAddress> addr = obj.GetAddr().ToList();

或者,您可以遵循当前的惯例,不显式键入变量,只需执行以下操作:

var addr = obj.GetAddr();

这将允许您将addr变量维护为GetAddr()方法返回的任何返回类型。您仍然可以访问该返回类型的所有属性。

最新更新