Лучший способ доставить статическую хэш-таблицу c # - PullRequest
3 голосов
/ 12 июня 2009

У меня в качестве примера:

public enum HttpRequestHeader
{
  Accept,
  AcceptCharset
}

public static class HTTP
{
  public static Hashtable HttpRequestHeaderString
  {
    get
    {
      Hashtable returnHashtable = new Hashtable();
      returnHashtable.Add(HttpRequestHeader.Accept,"Accept");
      returnHashtable.Add(HttpRequestHeader.AcceptCharset,"Accept-Charset");
      return returnHashtable;
    }
  }
}

Я буду получать доступ:

string HttpRequestHeaderString
    = HTTP.HttpRequestHeaderStrings[HttpRequestHeader.Accept]

много раз. Так как это static HashTable, есть ли лучший способ обеспечить ту же функциональность более эффективно?

Я понимаю, что могу реализовать это конкретное решение, используя другой тип коллекции, но если я хочу использовать HashTable - какие варианты у меня есть?

Большое спасибо заранее ТАК!

Ответы [ 2 ]

6 голосов
/ 12 июня 2009

Хотите, чтобы вызывающие абоненты могли изменять словарь? Если это так, то иметь статичный звук - очень странная идея. Если нет, то вам действительно нужно иметь возможность отвечать на запросы для Accept и AcceptCharset, что я, вероятно, сделал бы в простом выражении switch.

Вы говорите, что действительно хотите использовать Hashtable - почему? Какая картина здесь больше?

Статическое отображение изменчивых структур данных - это почти всегда плохая идея. Если вам нужен помощник для построения хеш-таблицы с некоторыми начальными значениями, тогда я бы сделал это методом, а не свойством. Если вам не нужна мутация, я бы написал метод для извлечения значения для конкретного HttpRequestHeader, а не для демонстрации коллекции. Например:

public static class HTTP
{
    public static string GetHeaderString(HttpRequestHeader header)
    {
        // Use a dictionary here if you want. The API is the important bit

        switch (header)
        {
            case HttpRequestHeader.Accept: return "Accept";
            case HttpRequestHeader.AcceptCharset: return "Accept-Charset";
            default: throw new KeyNotFoundException(header.ToString());
        }
    }
}

Другим вариантом может быть перечисление заголовков в стиле Java:

public sealed class RequestHeader
{
    public static RequestHeader Accept = new RequestHeader("Accept");
    public static RequestHeader AcceptCharset = 
        new RequestHeader("Accept-Charset");

    private readonly string name;

    private RequestHeader(string header)
    {
        this. name = name;
    }

    public string Name
    {
        get { return name; }
    }
}

Вам нужно будет выполнить проверку по null, но это будет единственное недопустимое значение RequestHeader, которое вы можете получить. (Перечисления не проверяются по диапазону, так что кто-то может легко написать ((HttpRequestHeader)-1) в вашем текущем коде ... другими словами, это не исправит проверку аргументов.)

РЕДАКТИРОВАТЬ: В ответ на комментарий, если вы используете C # 3 и хотите активную инициализацию (чтобы облегчить жизнь), вы можете написать:

public static class HTTP
{
    private static readonly Dictionary<HttpRequestHeader, string> Headers =
        new Dictionary<HttpRequestHeader, string>
    {
        ( HttpRequestHeader.Accept, "Accept" ),
        ( HttpRequestHeader.AcceptCharset, "Accept-Charset" )
    };

    public static string GetHeaderString(HttpRequestHeader header)
    {
        return Headers[header];
    }
}
3 голосов
/ 12 июня 2009

Какое преимущество дает хеш-таблица по сравнению с написанием этого:

public static class Http
{
    public const string HttpRequestAccept = "Accept";
    public const string HttpRequestAcceptCharset = "Accept-Charset";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...