2009-05-22 77 views
3

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

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

回答

11

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

从MSDN线意味着你创建对象openWith它实现在IDictionary的接口中定义的功能(方法)。

当使用字典声明变量,如:

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

你是绑定与混凝土类型的对象。但是,当你使用

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

你可以实现IDictionary的接口任何对象使用它,也许你自己的自定义类:)

9

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

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

IDictionary不是很有代表性。相反,考虑一个IDataReader接口。你一定处理ADO.NET,所以这应该很熟悉:

public Foo PopulateFromDataReader(SqlDataReader dataReader) 

这种特殊的方法是紧耦合的SqlDataReader,所以你不得不重写它为它的支持,比方说,访问或Oracle或MySQL或Firebird或其他。换句话说,你依靠实施。

现在考虑:

public Foo PopulateFromDataReader(IDataReader dataReader) 

这种方法可以与任何类实现IDataReader,这与基本任何ADO.NET兼容的数据提供者是指使用。

+0

+1非常好的例子.. :)你清除了让我迷惑的差异...很好的例子。 – 2012-07-26 13:47:27

5

这对任何其他接口都没有什么不同。试着思考一个简单的例子:

interface IThermometer 
{ 
    double CurrentTemperature { get; } 
} 

现在我们有一种方式来获得的温度,虽然我们不关心它究竟是如何测量的。我们可以创建各种实现:

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

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

+0

+1这个例子... – 2012-07-26 13:44:40

1

我怀疑你只是忽略类型为IDictionary<,>(接口)变量之间的差异,并初始化为Dictionary<,>值(参考)(注意没有I;具体类型)。

1

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