2013-12-20 16 views
1

在C#中,當我想封裝一個List時,我把它放在一個類的內部,並在其中拋出一些輔助方法。但是,我注意到,只要我想遍歷項目列表,我只是返回列表。簡單。然而,這有什麼不好的是,我無法分辨列表是否被某種方法錯誤修改過。通過方法調用封裝C#列表

原來這就是我一直在做:

class Animals 
{ 
    private List<Dog> _dogs; 

    public List<Dog> Dogs 
    { 
     get { return _dogs; } 
    } 

} 

要conteract這一點,我想這樣做的:

class Animals 
{ 
    private List<Dog> _dogs; 

    public Dog GetDog(int dogid) 
    { 
     return _dogs[dogid]; 
    } 

    public int Count 
    { 
     get { return _dogs.Count; } 
    } 
} 

我用這種方法真正的問題在於這樣一個事實:每一次我想要列表中的項目,必須調用一個方法。這意味着如果我想遍歷列表,我必須設置一個循環,以便在每次迭代中調用Animals.GetDog(i)的次數爲Animals.Count

這是否會影響我的程序?有沒有更適合完成同樣事情的方法?

我已經看過封裝列表的方式,但它們看起來相當複雜。我的主要目標是不要將_dogs列表暴露給班級以外的任何人。

+1

爲什麼你不想在第一個地方公開列表?只是問,因爲沒有答案,很難說如何幫助你。 –

+1

我真的不知道你的問題。你想要做什麼? –

+0

我不想公開基礎列表,因爲這樣做可以讓外部類修改列表中的值,而不需要知道容器類。 – Sam

回答

6

您可以使用一個IEnumerable相當簡單地封裝列表:

public IEnumerable<Dog> GetDogs() 
{ 
    foreach (Dog dog in _dogs) 
    { 
     yield return dog; 
    } 
} 

這可以讓你從類的外部列舉的名單,但沒有獲得基礎列表。

//Outside Animals class 
foreach (Dog dog in animalObj.GetDogs()) 
{ 
    //do stuff 
} 
+0

感到困惑!我不得不環顧四周,看看它是什麼意思,但我可以看到這方面的一些價值。謝謝。 – Sam

2

您可以返回ReadOnlyCollection而非List

public class Animals 
{ 
    public Animals() 
    { 
     myModifiableDogList = new List<Dog>(); 
     Dogs = new ReadOnlyCollection<Dog>(myModifiableDogList); 
    } 

    private IList<Dog> myModifiableDogList; 
    public ReadOnlyCollection<Dog> Dogs { get; private set; } 
} 

這種方式,您可以更改名單,不允許任何人訪問Dogs屬性來改變它。這也允許用戶始終擁有更新的集合,而不是總是返回列表的副本。

+2

您也可以返回myModifiableDogList.AsReadOnly(); –

+0

這也是一個有效的選項,謝謝。 –

1

解決問題以返回列表的只讀快照的常見方法,例如,

public ReadOnlyCollection<Dog> Snapshot 
{ 
    get 
    { 
     return new ReadOnlyCollection<Dog>(_dogs); 
    } 
}