2014-10-09 102 views
9

在.NET中,我们可以使用<configSections>元素创建自定义配置节,就像这样:DictionarySectionHandler和NameValueSectionHandler有区别吗?

<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

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

那么,有没有区别,还是我可以互换使用它们?

回答

10

TL; DRNameValueSectionHandler是罚款string - >string对在简单的情况,但如果您需要的配置是有效的(特别是如果你要反复使用remove),使用DictionarySectionHandler


我挖成这两个类(NameValueDictionary)的来源,发现在实施差别很小。

有两件事情值得一提,虽然:

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

至于HashtableNameValueCollection之间的差异,NameValueCollection可以有重复键,但Hashtable不能。此外,Hashtable在其实施中效率更高。

This article on the MSDN Blog有一些关于HashtableNameValueCollection的信息。

总结他们的研究结果,Hashtable是...

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

他们包裹起来的文章有关于何时使用NameValueCollection一些有用的信息:

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

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

相关问题