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