div*_*nci 3 c# static design-patterns 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我将访问:
string HttpRequestHeaderString
= HTTP.HttpRequestHeaderStrings[HttpRequestHeader.Accept]
Run Code Online (Sandbox Code Playgroud)
多次.由于这是一个static HashTable,有没有更好的方法来更有效地提供相同的功能?
我知道我可以使用不同类型的集合来实现这个特定的解决方案,但如果我想使用HashTable- 我有什么选择?
非常感谢提前SO!
你想让调用者能够改变字典吗?如果是这样,拥有一个静态的听起来像一个非常奇怪的想法.如果没有,你真的只需要能够响应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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是拥有类似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; }
}
}
Run Code Online (Sandbox Code Playgroud)
您需要对其进行检查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];
}
}
Run Code Online (Sandbox Code Playgroud)