.NET ICollection类基础知识

时间:2012-03-01 12:07:59

标签: c# icollection

全部,我有一个应用程序需要定期附加和分离多个SQL数据库。我想创建一个类,将所有这些数据库保存为可以迭代的集合。要做到这一点,我继承自ICollection,但有一些想法我不理解:

class SqlDataBases : ICollection<SqlDb>
{
    private List<SqlDb> dbColl;

    public SqlDataBases()
    {
        dbColl = new List<SqlDb>();
    }

    // Add an index to the collection.
    public SqlDb this[int _nIndex]
    {
        get { return (SqlDb)dbColl[_nIndex]; }
        set { dbColl[_nIndex] = value; }
    }

    // et al.
}

public class DbEnumerator : IEnumerator<SqlDb>
{
    // ...
}

class SqlDb
{
    private string strMdfFullPath;
    private string strLdfFullPath;
    private bool bIsAttached;

    public SqlDb(string _strMdfFullPath, string _strLdfFullPath, bool _bIsAttached)
    {
        this.strMdfFullPath = _strMdfFullPath;
        this.strLdfFullPath = _strLdfFullPath;
        this.bIsAttached = _bIsAttached;
    }
}

我的问题是“为什么要继承ICollection,当你必须自己添加'添加','包含'等方法?或者你必须按照{{{ 3}}?我一直在阅读“C#in a Nutshell”,这个问题在这本伟大的书中引人注目。

我道歉,我知道我在这里遗漏了一些东西......

5 个答案:

答案 0 :(得分:3)

  

我的问题是“当你必须自己添加诸如'添加','包含'等方法时,为什么要继承ICollection?

ICollection<T>接口 - 它只是指定您必须实现的成员。如果您想从已经具有实现的内容派生,请查看Collection<T>。如果您想创建具有自己特殊特征的自己的集合数据结构,您可以自己实现该界面 - 我怀疑您是否想要这样做。

说实话,目前还不清楚为什么你想要自己的课程 - 为什么不直接在客户端代码中使用List<SqlDb>

答案 1 :(得分:3)

您是否考虑过直接使用List<SqlDb>

我希望通过SqlDataBases类获得什么并不明显。

如果您无法直接使用List<SqlDb>,请考虑继承List<SqlDb>而不是ICollection<SqlDb>

答案 2 :(得分:2)

接口只是骷髅。它们不包含任何逻辑,它们只包含所有方法,属性等的签名。

Interfaces

答案 3 :(得分:2)

继承ICollection&lt;&gt;的原因是创建自己的自定义集合类型。然后,如果某个方法的输入变量为ICollection&lt;&gt;,因为您从ICollection&lt;&gt;继承,则可以传入新的自定义集合类型。

在您的情况下,您只需使用List&lt;&gt;直到您发现需要创建自定义集合。

答案 4 :(得分:1)

回答“当你必须添加诸如'添加'之类的方法时,为什么要继承ICollection”:

如果您不需要/想要添加/下一个等,则不需要继承ICollection。