使用ICollection而不是List
本文关键字:List ICollection 使用 | 更新日期: 2023-09-27 17:57:40
我有一个外部方法,它返回List<IPAddress>
我在我的类中写了另一个方法,它是这个方法的包装器。但我被告知不要返回List<>
,而是返回IList
或ICollection
。现在我有什么:
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()
方法返回的任何返回类型。您仍然可以访问该返回类型的所有属性。