2010-12-14 51 views
1

我可以從我的DAL返回列表嗎?在互聯網上,我在某處讀到它不好。 返回列表有什麼問題?C#DAL returing generic列表<T>

+0

的可能重複[C# - 列表或IList的](http://stackoverflow.com/questions/400135/c-listt-or-ilistt) – 2010-12-14 21:03:18

回答

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>(); 
    } 
} 
+2

如何只返回IEnumerable的''?這更加靈活。 – 2010-12-14 21:01:42

+3

@John:或許,但我會傾向於'ICollection ''IEnumerable '。如果這是一個DAL類,修改可能是必要的,修改IEnumerables並不重要,而'ICollection '暴露了變異方法。 – cdhowie 2010-12-14 21:02:46

+1

如果你不需要索引或計數,你可以使用'IEnumerable ',然後你會有更多的靈活性,比如返回一個懶惰的枚舉選項。 – configurator 2010-12-14 21:02:57

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>將無濟於事。

但是,對於數據訪問對象,它(希望)不會保留任何查詢的結果,因此每次都會返回列表的新副本,並且不會受到任何客戶端的修改的影響。

+0

如果對列表的任何修改都將被忽略,爲什麼不返回'IEnumerable '。看起來更誠實。 – 2010-12-14 22:36:53