DictionarySectionHandler和NameValueSectionHandler之间有区别吗



在.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>

在上面,我定义了两个部分。一个是类型DictionarySectionHandler,另一个是NameValueSectionHandler

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

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

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


我深入研究了这两个类(NameValue、Dictionary)的源代码,发现在实现方面几乎没有什么区别。

不过,有两件事值得注意:

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

HashtableNameValueCollection之间的差异而言,NameValueCollection可以具有重复密钥,但Hashtable不能。此外,Hashtable在实现方面的效率要高得多。

MSDN博客上的这篇文章提供了一些关于HashtableNameValueCollection的好信息。

总结他们的发现,Hashtable是…

  • 查找效率提高2.6倍
  • 增加8.5倍的效率
  • 一个数量级的移除效率更高

他们在文章的结尾提供了一些关于何时使用NameValueCollection:的有用信息

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

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

最新更新