C#DAL returing通用列表<;T>;

C#DAL returing通用列表<;T>;,c#,generics,C#,Generics,我可以从我的DAL中返回列表吗?在互联网上,我在某个地方读到它不好。 如果返回列表,会有什么问题?您可以返回列表对象,但属性应改为键入IList。这将允许您更改以后使用的列表实现,而不会破坏与根据库编译的现有程序集的二进制兼容性 此示例可能与您的构造函数模式不匹配,但它演示了我的意思(通过IList属性返回List): 公共类Foo { 公共IList字符串{get;private set;} 公共食物( { AlistOfstring=新列表(); } } 您可以返回列表对象,但属性应改为键入

我可以从我的DAL中返回列表吗?在互联网上,我在某个地方读到它不好。
如果返回列表,会有什么问题?

您可以返回
列表
对象,但属性应改为键入
IList
。这将允许您更改以后使用的列表实现,而不会破坏与根据库编译的现有程序集的二进制兼容性

此示例可能与您的构造函数模式不匹配,但它演示了我的意思(通过
IList
属性返回
List
):

公共类Foo
{
公共IList字符串{get;private set;}
公共食物(
{
AlistOfstring=新列表();
}
}

您可以返回
列表
对象,但属性应改为键入
IList
。这将允许您更改以后使用的列表实现,而不会破坏与根据库编译的现有程序集的二进制兼容性

此示例可能与您的构造函数模式不匹配,但它演示了我的意思(通过
IList
属性返回
List
):

公共类Foo
{
公共IList字符串{get;private set;}
公共食物(
{
AlistOfstring=新列表();
}
}

原则上,返回
List
没有问题,但是一个常见的问题是当类返回违反封装的成员
List
变量时,例如

public class SomeClass<T>
{
    public List<T> Items { get; private set; }
    public void DoSomething()
    {
        T first = Items[0];
        ...
    }
}
公共类SomeClass
{
公共列表项{get;private set;}
公共无效剂量测定法()
{
T first=项目[0];
...
}
}
在这种情况下,该类的任何客户端都可以修改其状态,这可能会导致错误,因为该类不再能够保护其不变量。请注意,在这种情况下,返回IList将没有帮助


但是,对于数据访问对象,它(希望)不会保留任何查询的结果,因此每次都会返回列表的新副本,并且不会受到任何客户端修改的影响。

原则上,返回
列表没有问题,然而,一个常见的问题是当类返回一个违反封装的成员
List
变量时,例如

public class SomeClass<T>
{
    public List<T> Items { get; private set; }
    public void DoSomething()
    {
        T first = Items[0];
        ...
    }
}
公共类SomeClass
{
公共列表项{get;private set;}
公共无效剂量测定法()
{
T first=项目[0];
...
}
}
在这种情况下,该类的任何客户端都可以修改其状态,这可能会导致错误,因为该类不再能够保护其不变量。请注意,在这种情况下,返回IList将没有帮助


但是,对于数据访问对象,它(希望)不会保留任何查询的结果,因此每次都会返回列表的新副本,并且不会受到任何客户端修改的影响。

只返回
IEnumerable
?约翰:也许吧,但我更喜欢
ICollection
而不是
IEnumerable
。如果这是一个DAL类,可能需要修改,修改IEnumerables是非常重要的,而
ICollection
公开了变异方法。如果您不需要索引或计数,可以使用
IEnumerable
,这样您就有了更大的灵活性,与返回惰性枚举的选项类似。@cdhowie:
ICollection
正在对如何使用集合进行假设。我不想那样做。@John:IEnumerable也一样。只有开发人员才能有效地选择合适的。只返回
IEnumerable
怎么样?约翰:也许吧,但我更喜欢
ICollection
而不是
IEnumerable
。如果这是一个DAL类,可能需要修改,修改IEnumerables是非常重要的,而
ICollection
公开了变异方法。如果您不需要索引或计数,可以使用
IEnumerable
,这样您就有了更大的灵活性,与返回惰性枚举的选项类似。@cdhowie:
ICollection
正在对如何使用集合进行假设。我不想那样做。@John:IEnumerable也一样。只有开发人员才能有效地选择合适的。的可能副本的可能副本如果对列表的任何修改都将被忽略,为什么不返回
IEnumerable
。看起来更诚实。如果对列表的任何修改都将被忽略,为什么不返回
IEnumerable
。这似乎更诚实。