请说明 C# 中 NameValueCollection 的类型归属与主要用途,并描述其与普通字典在键值存储上的差异,以及如何通过它完成键值对的添加、读取与遍历操作。
考察说明
考察对 C# 中 NameValueCollection 这一专用集合的特性与使用方法是否清晰。
回答思路
- 【回答框架 1】NameValueCollection 是 System.Collections.Specialized 命名空间下的一个集合类,专门用于存储键值对,其特点是每个键可以对应多个值,且键与值均以字符串形式保存。它允许通过键名索引来获取聚合后的值,也可通过整数索引访问全部键值。
- 【回答框架 2】主要差异在于:普通 Dictionary 要求键唯一,而 NameValueCollection 允许重复键,后续添加的同名键值不会覆盖已有值,而是追加到该键的值列表中。读取时,按名称取值会默认用逗号分隔并拼接所有关联值;同时它也支持按序号遍历所有键值对。
- 【回答框架 3】使用时,通常先实例化 NameValueCollection,然后通过 Add(key, value) 添加键值对,或者使用索引设置属性。读取时可用 collection['key'] 获取聚合字符串,也可用 GetAllValues(key) 获取字符串数组。遍历时可用两个循环分别遍历 AllKeys 和按索引取值。
- 【回答框架 4】在实际场景中,它适合模拟查询字符串、表单字段或请求头这类一个名字对应多个值的结构。由于键和值都限定为字符串,性能与类型安全不如泛型字典,因此在需要类型约束或高性能读写时应优先选用 Dictionary。
- 【回答框架 5】需要留意,NameValueCollection 的索引器在键不存在时返回 null,且其值拼接顺序与添加顺序一致;但修改键的值会覆盖旧值,而不是追加。
- 【关键点 1】NameValueCollection 专用于字符串键值对,且允许一个键对应多个值。
- 【关键点 2】Add 方法追加同名键值,索引器赋值则会覆盖同名旧值。
- 【关键点 3】Get 和 GetAllValues 分别返回聚合字符串与全部值数组。
- 【关键点 4】AllKeys 属性可获取所有键,便于遍历。
- 【关键点 5】内部基于哈希表实现,但性能与类型安全弱于 Dictionary。
- 【易错点 1】容易误以为 NameValueCollection 与字典一样键不可重复,忽略其多值特性。
- 【易错点 2】直接使用索引器读取不存在的键返回 null,与字典抛异常的行为不同。
- 【易错点 3】过度依赖字符串拼接值可能导致分隔符歧义,解析时应选用 GetAllValues。