我可以从DAL返回List吗?在互联网上,我在某处读到它并不好。 如果返回List会有什么问题?
答案 0 :(得分:9)
您可以返回List<T>
个对象,但该属性应该是类型 IList<T>
。这将允许您更改稍后使用的列表实现,而不会破坏与针对您的库编译的现有程序集的二进制兼容性。
此示例可能与您的构造函数模式不匹配,但它演示了我的意思(通过List<T>
属性返回IList<T>
):
public class Foo
{
public IList<string> AListOfStrings { get; private set; }
public Foo()
{
AListOfStrings = new List<string>();
}
}
答案 1 :(得分:0)
原则上,返回List<T>
没有问题,但是一个常见的问题是当类返回违反封装的成员List<T>
变量时,例如。
public class SomeClass<T>
{
public List<T> Items { get; private set; }
public void DoSomething()
{
T first = Items[0];
...
}
}
在这种情况下,此类的任何客户端都可以修改其状态,这可能导致错误,因为类无法再保护其不变量。请注意,在这种情况下返回IList<T>
无济于事。
但是对于数据访问对象,它(希望)不会保留任何查询的结果,因此每次都会返回列表的新副本,并且不会受到任何客户端修改的影响。