HttpValueCollection и NameValueCollection

В чем разница между HttpValueCollection и NameValueCollection?
Если возможно, объясните, пожалуйста, пример.

Спасибо

Ответ 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());
    }
}

Ответ 2

Одна точка, которая не очевидна в ответе Дарина, заключается в том, что 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