dictionary(Of String,String)和IDictionary(Of String,String)之间有什么区别

Kev*_*vin 3 c# vb.net asp.net

我可以用IDictionary做更多或更少的事情吗?这两个系列有何不同?

Jac*_*ope 8

IDictionary只是一个接口 - 一个描述实现类必须执行的操作的契约.Dictionary是实现该接口的具体类,因此必须提供IDictionary接口中描述的方法.

如果你想创建一个字典,你必须创建一个具体的类(即字典),但如果你想用该字典做的只是IDictionary接口公开的方法,你可以将concreate类作为接口传递 - 这减少了耦合方法之间.


Ben*_*ack 6

我想每个人都已经指出IDictionary(Of String, String)的是,一个接口不能被实例化一个对象,并且Dictionary(Of String, String)是一类可以被实例化一个对象.但是,重要的是要知道为什么你可以使用一个与另一个.

假设您要定义一种方法来搜索字典并返回与该键相关联的值; 如果找不到值,则需要返回一个emtpy字符串.你需要一本字典,所以你决定继续使用.NET的Dictionary类来实现:

Function GetValueFromKey(ByVal dict As Dictionary(Of String, String),
                         ByVal key As String) As String
    If ''//you find the value in the dictionary
         return theValue
    Else ''//you can't find the value in the ditionary
         return String.Empty
    End If
End Function
Run Code Online (Sandbox Code Playgroud)

您实现了代码,您的方法运行良好.但是,几个月后,您会注意到您的程序开始变慢.当您深入研究问题时,您会发现Dictionary当您的关键数据长度为50,000个字符时,.NET的实现并不理想(注意:老实说,我不知道.NET的Dictionary实现是否存在任何实际问题;这是只是一个例子),所有的密钥字符串长度超过50,000个字符.

所以现在你必须找到一种不使用.NET Dictionary类的查找数据的新方法.您将不得不使用新的数据类型,然后在您的代码中的任何地方使用GetValueFromKey(...),您将不得不进行修改以使用新的数据类型.这不是世界末日,但也许有更好的方法.

当你第一次编写你的GetValueFromKey方法时,你可能会想到"我需要从字典中检索一个值.无论它是什么类型的字典都无关紧要,但我需要从中获取它的价值." 在这种情况下,您可以选择使用如下IDictionary界面:

Function GetValueFromKey(ByVal dict As IDictionary(Of String, String),
                         ByVal key As String) As String
    If ''//you find the value in the dictionary
         return theValue
    Else ''//you can't find the value in the ditionary
         return String.Empty
    End If
End Function
Run Code Online (Sandbox Code Playgroud)

关于该功能的一切看起来都是一样的,除了Dictionary改为IDictionary?您的功能实现是否发生了变化?不. IDictionary只是一个定义字典需要具有的属性和方法的契约.您所关心的所有功能都是调用字典的属性和方法.您的功能并不关心它是如何实现的.

通过这种方式,如果你已经编程到一个IDictionary接口而不是一个Dictionary实现,当你的程序放慢速度并且你被迫改变你的字典实现时,你可以简单地编写自己的字典类来实现IDictionary.只要你的新类遵循规定的合同IDictionary,没有你的其他代码需要改变,以应对您所创建的新字典类.

设计原则"程序到界面而不是实现"可以帮助您处理变更.如果您开始学习如何在代码中使用接口,那么您将更好地准备应对更改.