【问题标题】:.NET ICollection Class Basics.NET ICollection 类基础知识
【发布时间】:2012-03-01 12:07:59
【问题描述】:

所有,我有一个需要定期附加和分离多个 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 继承,当您必须自己添加诸如 'Add'、'Contains' 等方法时?或者您是否必须按照MSDN 中的建议自己执行此操作?我一直在阅读“C# in a Nutshell”,这个问题在这本好书中没有得到解决。

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

【问题讨论】:

  • 我的想法是一样的;你为什么不在需要的地方使用List&lt;SqlDb&gt;?据我所知,它具有您尝试实现的功能。
  • @Killercam,下面的一条评论建议使用字典。除非您想一遍又一遍地按名称“查找”您的连接,否则 Dictionary 会更好,因为您可以指定数据库名称之类的键。

标签: c# icollection


【解决方案1】:

我的问题是“为什么要从 ICollection 继承,当您必须自己添加诸如 'Add'、'Contains' 等方法时?

ICollection&lt;T&gt; 是一个接口 - 它只是指定您必须实现的成员。如果您想从已经具有实现的东西中派生,请查看Collection&lt;T&gt;。如果您想创建自己的集合数据结构并具有自己的特殊特性,您将自己实现该接口 - 我怀疑您是否想这样做。

说实话,你根本不清楚为什么要在这里创建自己的类 - 为什么不直接在客户端代码中使用 List&lt;SqlDb&gt;

【讨论】:

  • 感谢乔恩,这解决了我的愚蠢问题。你是对的,我在这里只需要一个List&lt;SqlDb&gt; - 但我之前没有创建自己的集合类并想这样做,但这是愚蠢的。感谢您的宝贵时间。
【解决方案2】:

你有没有想过直接使用List&lt;SqlDb&gt;

对我来说,您希望通过 SqlDataBases 类获得什么并不明显。

如果您不能直接使用List&lt;SqlDb&gt;,请考虑从List&lt;SqlDb&gt; 继承而不是ICollection&lt;SqlDb&gt;

【讨论】:

  • 虽然我会把它放入字典中......但原因尚不清楚
【解决方案3】:

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

Interfaces

【讨论】:

    【解决方案4】:

    从 ICollection 继承的原因是创建自己的自定义集合类型。然后,任何方法的输入变量为 ICollection,因为您继承自 ICollection,所以可以传入新的自定义集合类型。

    在你的情况下,你可以简单地使用 List 直到你发现需要创建一个自定义集合。

    【讨论】:

      【解决方案5】:

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

      如果您不需要/不想拥有 Add/Next 等,则不需要继承 ICollection。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-16
        • 2018-05-25
        • 2014-11-28
        • 2014-02-14
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多