字典部分处理程序和名称值部分处理程序有什么区别?

12
在.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的部分。

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

那么,它们有什么区别吗?或者说我可以交替使用它们吗?

1个回答

12
TL;DR NameValueSectionHandler 对于简单情况下的 string->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相同的渐近行为,并且还避免了任何由于装箱而产生的成本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接