在.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;DRNameValueSectionHandler
对string
->string
在简单的情况下是成对的,但如果您需要高效的配置(特别是如果您要重复使用remove
),请使用DictionarySectionHandler
。
我深入研究了这两个类(NameValue、Dictionary)的源代码,发现在实现方面几乎没有什么区别。
不过,有两件事值得注意:
- 正如处理程序的名称所暗示的那样,主要区别在于它们使用的集合:
DictionarySectionHandler
将其键/值对存储在Hashtable
中,而NameValueSectionHandler
使用NameValueCollection
- 在
DictionarySectionHandler
中,不需要value
,如果不提供,则默认为空字符串,但NameValueSectionHandler
需要value
就Hashtable
和NameValueCollection
之间的差异而言,NameValueCollection
可以具有重复密钥,但Hashtable
不能。此外,Hashtable
在实现方面的效率要高得多。
MSDN博客上的这篇文章提供了一些关于Hashtable
和NameValueCollection
的好信息。
总结他们的发现,Hashtable
是…
- 查找效率提高2.6倍
- 增加8.5倍的效率
- 一个数量级的移除效率更高
他们在文章的结尾提供了一些关于何时使用NameValueCollection
:的有用信息
因此,您可能想知道何时要使用NameValueCollection。NameValueCollection只接受字符串的键和值,因此这是一个非常特殊的集合。在需要将多个值与一个键关联,或者进行基于哈希的查找以及按索引查找(希望不要执行太多删除)的情况下,它很有用。
但是,如果需要存储字符串键/值对,并且不需要执行基于索引的查找或将多个值与一个键关联,则可能更喜欢使用通用Dictionary类。这在所有情况下都具有与Hashtable相同的渐近行为,并且还避免了由于装箱而产生的任何成本。