我在想如果每个应用程序都是全局的,那么将数据加载到集合的最佳方法是什么;
public static class ErrorValues
{
public static readonly Dictionary<int, string> errorInfo = new Dictionary<int, string>
{
{0, "Error 404"},
{1, "Error 500"},
{2, "Error 301"}
};
}
或者像这样
public static class ErrorValues
{
public static Dictionary<int, string> errorInfo;
static ErrorValues()
{
if (errorInfo == null)
{
errorInfo = LoadDataToDictionary();
}
}
}
更好的解决方案?为什么呢?
答案 0 :(得分:3)
如果您的数据是静态的,我建议您创建一个有意义的类型
示例:
public class ErrorValue
{
private static Dictionary<Int32, ErrorValue> _errors;
public static readonly ErrorValue Error404 = new ErrorValue(404, "Error 404");
public static readonly ErrorValue Error500 = new ErrorValue(500, "Error 500");
public static readonly ErrorValue Error301 = new ErrorValue(301, "Error 301");
public String ErrorName { get; private set; }
public Int32 ErrorCode { get; private set; }
private ErrorValue(Int32 errorCode, String errorName)
{
if (_errors == null)
_errors = new Dictionary<int, ErrorValue>();
ErrorName = errorName;
ErrorCode = errorCode;
_errors.Add(errorCode, this);
}
public static IEnumerable<ErrorValue> Errors { get { return _errors.Values; } }
public static ErrorValue GetErrorByCode(Int32 errorCode)
{
return _errors[errorCode];
}
}
由于类型安全性,这将导致代码更容易出错,因为您可以编写类型为ErrorValue
的参数的方法:
void HandleError(ErrorValue ev)
{
// bla bla
}
另一个好处是,通过这种方法,您可以轻松扩展类型;例如添加其他属性,例如Description
,而无需对代码进行大量更改。
如果您需要类似的静态全局集合,则可以提取公共通用基类以提供GetById
或GetByName
或类似方法。
答案 1 :(得分:1)
除了beforefieldinit标志外,生成的IL应该没有区别。
答案 2 :(得分:1)
我认为第一个很简单,如果项目是静态/硬编码的,不能从DB或其他数据源加载。
第二个是使用单例模式,该模式在应用程序中大量使用,其中对象仅创建一次,并在应用程序的整个生命周期中重用该对象引用。并提供从任何其他数据源初始化集合。
结论:两者都很好,但取决于你需要什么。我个人喜欢第二种方式,因为它遵循设计模式。