IDictionary接口的目的

时间:2009-05-22 06:36:53

标签: c# idictionary

IDictionary界面的需求是什么。如何初始化IDictionary接口。毕竟它只是一个界面。以下代码段来自msdn。我无法理解。

IDictionary<string, string> openWith = new Dictionary<string, string>();

5 个答案:

答案 0 :(得分:11)

它定义了Dictionary应该实现的重要functions

来自MSDN的行意味着您正在创建一个对象 openWith ,它实现了 IDictionary 接口中定义的函数(方法)。

当您使用Dictionary声明变量时:

Dictionary<string,string> openWith=.....;

您与具体类型的对象绑定。但是当你使用

IDictionary<string,string> openWith=....;

您可以将它与任何实现 IDictionary 接口的对象一起使用,也许是您自己的自定义类:)

答案 1 :(得分:9)

接口的全部意义在于提供......以及任何模块的接口(我在广义上使用“模块”),这样调用代码就不必担心这个特定接口是如何实现的。

至于“如何初始化IDictionary接口”,这在技术上是不正确的。可以初始化的是变量,其类型为IDictionary<T, V>。确实必须初始化变量,但这通常隐藏在“客户端代码”之外。

然而,

IDictionary不是很有代表性。相反,请考虑IDataReader接口。您肯定已经处理过ADO.NET,所以这应该看起来很熟悉:

public Foo PopulateFromDataReader(SqlDataReader dataReader)

这个特殊的方法与SqlDataReader紧密耦合,所以你必须重写它才能支持,比如Access或Oracle或MySQL或Firebird等等。换句话说,你依赖于实施。

现在考虑:

public Foo PopulateFromDataReader(IDataReader dataReader)

此方法可用于实现IDataReader的任何类,这意味着基本上与任何与ADO.NET兼容的数据提供程序。

答案 2 :(得分:5)

与任何其他界面没有什么不同。试着考虑一个更简单的例子:

interface IThermometer
{
    double CurrentTemperature { get; }
}

现在我们有办法获得温度,但我们并不关心它的测量方式。我们可以创建各种实现:

class MercuryThermometer : IThermometer
{
    public double CurrentTemperature
    {
        get { return ... /* gets the temperature somehow */ }
    }
}

程序的其余部分不需要知道它正在使用哪个温度计。

答案 3 :(得分:1)

我怀疑你只是忽略了键入为IDictionary<,>(界面)的变量与初始化为Dictionary<,>的值(引用)之间的区别(注意没有I;具体类型)。

答案 4 :(得分:1)

它对单元测试也很有用。您可以为接受IDictionary而不是Dictionary的方法编写单元测试并传递模拟。如果它接受一个类实例(也可能是密封的)你会有点搞砸(你必须使用适配器模式等)。