DictionarySectionHandler和NameValueSectionHandler之间有区别吗?

Luk*_*uke 10 .net c# configuration app-config configsection

在.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>
Run Code Online (Sandbox Code Playgroud)

上面,我定义了两个部分.一种类型DictionarySectionHandler,另一种类型NameValueSectionHandler.

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

那么,是否存在差异,或者我可以互换使用它们吗?

Luk*_*uke 11

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


我挖掘了这两个类的来源(NameValue,Dictionary),发现实现上差别很小.

但有两件事值得注意:

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

至于Hashtable和之间的区别NameValueCollection,NameValueCollection可以有重复的键,但Hashtable不能.此外,Hashtable它的实现效率非常高.

这篇关于MSDN博客的文章有一些关于Hashtable和的好信息NameValueCollection.

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

  • 查找效率提高2.6倍.
  • 添加效率提高8.5倍.
  • 删除时效率提高了一个数量级.

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

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

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