IDictionary接口的需要是什么?IDictionary接口如何被初始化?毕竟它只是一个接口。以下代码片段来自MSDN,我无法理解它。
IDictionary<string, string> openWith = new Dictionary<string, string>();
IDictionary接口的需要是什么?IDictionary接口如何被初始化?毕竟它只是一个接口。以下代码片段来自MSDN,我无法理解它。
IDictionary<string, string> openWith = new Dictionary<string, string>();
它定义了一个字典应该实现的重要函数。
MSDN上的那行代码意味着你正在创建一个对象openWith,它实现了IDictionary接口中定义的函数(方法)。
当你使用Dictionary来声明变量时:
Dictionary<string,string> openWith=.....;
你被绑定在具体类型的对象上。但是当你使用
IDictionary<string,string> openWith=....;
你可以将其与实现了 IDictionary 接口 的任何对象一起使用,也许是你自定义的类 :)
public Foo PopulateFromDataReader(SqlDataReader dataReader)
SqlDataReader
紧密耦合,所以如果想要支持Access、Oracle或MySQL,你需要重新编写它。换句话说,你依赖于具体实现。public Foo PopulateFromDataReader(IDataReader dataReader)
这种方法可以与任何实现了 IDataReader
接口的类一起使用,也就是说基本上可以与任何兼容 ADO.NET 的数据提供程序一起使用。
interface IThermometer
{
double CurrentTemperature { get; }
}
现在我们有一种获取温度的方法,虽然我们不关心它是如何被测量的。我们可以创建各种实现:
class MercuryThermometer : IThermometer
{
public double CurrentTemperature
{
get { return ... /* gets the temperature somehow */ }
}
}
程序的其余部分不需要知道使用的是哪个温度计。
我猜你可能忽视了变量类型为 IDictionary<,>
(接口)和初始化值为 Dictionary<,>
(注意没有 I
,是具体的类型)之间的区别。
这对于单元测试也非常有用。你可以为一个接受IDictionary而不是Dictionary的方法编写一个单元测试,并传递一个模拟对象。如果它接受一个类实例(也可以是密封的),那么你会有一些麻烦(需要使用适配器模式等)。