【问题标题】:HttpValueCollection and NameValueCollectionHttpValueCollection 和 NameValueCollection
【发布时间】:2011-11-22 18:55:59
【问题描述】:

HttpValueCollectionNameValueCollection 有什么区别?
如果可能,请举例说明。

谢谢

【问题讨论】:

    标签: c#


    【解决方案1】:

    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,当您处理 url 并希望生成正确编码的参数时,您可以使用 HttpValueCollectionNameValueCollection 由于它的非泛型性质,我不会使用它。例如,我更喜欢类型更强的Dictionary<TKey, TValue>
    • 小修正 - NameValueCollection 默认对键不区分大小写,除非在构造函数中指定了区分大小写的比较器。
    • @Darin Dimitrov, Dictionary 与 NameValueCollection 有一些不同之处:它不维护插入顺序,并且每个键只允许一个值。它们通常可以以相同的方式使用,但如果您的值最终会出现在查询字符串中,您可能最终需要切换。只是我遇到过的事情。
    • "永远不应该用于您的代码" 当然,它们剥夺了我们有用的功能。 -_-
    【解决方案2】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 2010-10-11
      相关资源
      最近更新 更多