HttpValueCollection and NameValueCollection

36
什么是HttpValueCollectionNameValueCollection之间的区别?
如果可能的话,请通过示例进行说明。

谢谢

2个回答

56

NameValueCollection对键进行区分大小写,HttpValueCollection则不区分。此外,HttpValueCollection是从NameValueCollection派生的内部类,你不应该在代码中直接使用它。另外一个HttpValueCollection的特性是当你将值添加到这个集合中时,它会自动进行URL编码。

以下是如何使用HttpValueCollection类:

class Program
{
    static void Main()
    {
        // returns an implementation of NameValueCollection
        // which in fact is HttpValueCollection
        var values = HttpUtility.ParseQueryString(string.Empty);
        values["param1"] = "v&=+alue1";
        values["param2"] = "value2";*

        // prints "param1=v%26%3d%2balue1&param2=value2"
        Console.WriteLine(values.ToString());
    }
}

我们在什么情况下应该使用HttpValueCollection和NameValueCollection呢? - Amit Soni
@Amit,当你处理URL并想要生成正确编码的参数时,可以使用HttpValueCollection。由于其非泛型特性,NameValueCollection不是我会使用的类。例如,我更喜欢使用更强类型的Dictionary<TKey, TValue> - Darin Dimitrov
9
小修正 - 默认情况下,NameValueCollection 对键不区分大小写,除非在构造函数中指定了区分大小写的比较器。 - Ivan Korneliuk
@Darin Dimitrov,Dictionary与NameValueCollection有一些不同之处:它不维护插入顺序,并且每个键只允许一个值。它们通常可以以相同的方式使用,但如果您有将出现在查询字符串中的值,则可能需要切换。这是我遇到的一些问题。 - Jerph
“never supposed to use for your code” 的意思是“永远不应该在你的代码中使用”,当然,它们剥夺了我们一个有用的功能。-_- - jpmc26

10

在Darin的回答中不太明显的一点是,NameValueCollection没有重写ToString()方法,而HttpValueCollection则重写了它。这个特定属性和值的隐式URL编码使得后者成为将集合转换回查询字符串的正确选择。

public class Test
{
    public static void Main()
    {
        var httpValueCollection = HttpUtility.ParseQueryString(string.Empty);
        httpValueCollection["param1"] = "value1";
        httpValueCollection["param2"] = "value2";
        Console.WriteLine(httpValueCollection.ToString());

        var nameValueCollection = new NameValueCollection();
        nameValueCollection["param1"] = "value1";
        nameValueCollection["param2"] = "value2";
        Console.WriteLine(nameValueCollection.ToString());  
    }
}

输出:

param1=value1&param2=value2
System.Collections.Specialized.NameValueCollection

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