11

在 .NET 中,我们可以使用该<configSections>元素创建自定义配置部分,如下所示:

<configuration>
  <configSections>
    <section name="dictionarySample"
             type="System.Configuration.DictionarySectionHandler"/>
    <section name="nameValueSample"
             type="System.Configuration.NameValueSectionHandler" />
  </configSections>
  <dictionarySample>
    <add key="key1" 
         value="value1"/>
  </dictionarySample>
  <nameValueSample>
    <add key="key2" 
         value="value2" />
  </nameValueSample>
</configuration>

上面,我定义了两个部分。一个 type DictionarySectionHandler,另一个 type NameValueSectionHandler

据我所知,这两个处理程序的使用方式完全相同,并导致相同的配置部分。

那么,有区别吗,或者我可以互换使用它们吗?

4

1 回答 1

11

TL;DR NameValueSectionHandler适用于简单情况下的string->string对,但如果您需要配置高效(特别是如果您要remove重复使用),请使用DictionarySectionHandler.


我深入研究了这两个类(NameValueDictionary)的来源,发现实现上的差异很小。

不过有两点值得注意:

  1. 正如处理程序的名称所暗示的那样,主要区别在于它们使用的集合:DictionarySectionHandler将其键/值对存储在 a 中Hashtable,而NameValueSectionHandler使用 a NameValueCollection
  2. 在 中DictionarySectionHandlervalue不是必需的,如果未提供,则默认为空字符串,但NameValueSectionHandler需要value.

至于 和 之间的区别,Hashtable可以有重复的键,但不能。此外,它的实施效率要高得多。NameValueCollectionNameValueCollectionHashtableHashtable

MSDN 博客上的这篇文章有一些关于HashtableNameValueCollection.

总结他们的发现,Hashtable是...

  • 查找效率提高 2.6 倍。
  • 添加效率提高 8.5 倍。
  • 移除的效率要高一个数量级。

他们用一些关于何时使用的有用信息来结束这篇文章NameValueCollection

因此,您可能想知道何时要使用 NameValueCollection。NameValueCollection 只接受字符串的键和值,所以这是一个非常专业的集合。在您需要将多个值与一个键相关联,或者进行基于散列的查找以及按索引查找(希望不会执行太多删除)的情况下,它很有用。

但是,如果您需要存储字符串键/值对并且不需要执行基于索引的查找或将多个值与键关联,您可能更喜欢使用通用 Dictionary 类。这在所有情况下都具有与 Hashtable 相同的渐近行为,并且还避免了由于装箱而产生的任何成本。

于 2014-10-09T19:39:06.593 回答