以下问题的答案是:List<T> or IList<T>似乎总是同意返回接口比返回集合的具体实现更好.但我正在努力解决这个问题.实例化一个接口是不可能的,所以如果你的方法返回一个接口,它实际上仍然返回一个特定的实现.我写了两个小方法来try 这一点:
public static IList<int> ExposeArrayIList()
{
return new[] { 1, 2, 3 };
}
public static IList<int> ExposeListIList()
{
return new List<int> { 1, 2, 3 };
}
并在我的测试程序中使用它们:
static void Main(string[] args)
{
IList<int> arrayIList = ExposeArrayIList();
IList<int> listIList = ExposeListIList();
//Will give a runtime error
arrayIList.Add(10);
//Runs perfectly
listIList.Add(10);
}
在这两种情况下,当我try 添加一个新值时,我的编译器不会给我任何错误,但当我try 向数组添加某些内容时,将我的数组公开为IList<T>
的方法显然会出现运行时错误.
我的另一个担忧是基于linked question(我的重点)的公认答案:
如果您通过其他人将使用的库公开您的类,you generally want to expose it via interfaces rather than concrete implementations.如果您决定稍后更改类的实现以使用不同的具体类,这将有所帮助.在这种情况下,库的用户将不需要更新他们的代码,因为界面不会改变.
如果你只是在内部使用它,你可能不太在意,使用列表也可以.
想象一下,有人真的用我的ExposeListIlist()
方法得到的IList<T>
来添加/删除值.一切正常.但是现在,正如答案所示,因为返回接口更灵活,所以我返回数组而不是列表(我这边没问题!),然后他们就要请客了...
TLDR:
1) expose 接口会导致不必要的强制转换吗?这无关紧要吗?
2) 有时,如果库的用户不使用强制转换,当您更改方法时,他们的代码可能会中断,即使该方法仍然完好无损.
我可能想得太多了,但我没有得到普遍的共识,即返回接口比返回实现更可取.