我在想,如果每个应用程序都是全局的,将数据加载到集合的最佳方法是什么;
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();
}
}
}
更好的解决方案?为什么?
如果你的数据是静态的,我建议创建一个有意义的类型
例:
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
或类似方法。
生成的 IL 应该没有区别,除了 beforefieldinit 标志。
我认为如果项目是静态/硬编码的并且不从数据库或其他数据源加载,则第一个很简单。
第二种是使用单例模式,该模式在应用程序中大量使用,其中对象仅创建一次,并在应用程序的整个生命周期中重用该对象引用。 并提供初始化来自任何其他数据源的集合。
结论:两者都很好,但取决于您的需求。 就个人而言,我喜欢第二种方式,因为它遵循设计模式。