提供静态哈希表的最佳方式c#

时间:2009-06-12 12:53:01

标签: c# design-patterns static hashtable

我有以下作为例子:

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 - 我有哪些选项?

非常感谢SO!

2 个答案:

答案 0 :(得分:6)

您是否希望呼叫者能够改变字典?如果是这样,拥有一个静态的听起来像一个非常奇怪的想法。如果没有,你真的只需要能够响应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];
    }
}

答案 1 :(得分:3)

散列表给你写这个有什么好处:

public static class Http
{
    public const string HttpRequestAccept = "Accept";
    public const string HttpRequestAcceptCharset = "Accept-Charset";
}