实现静态全局集合的更好方法是什么



我在想,如果每个应用程序都是全局的,将数据加载到集合的最佳方法是什么;

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,而无需对代码进行大量更改。

如果需要类似的静态全局集合,可以提取一个通用泛型基类来提供 GetByIdGetByName 或类似方法。

生成的 IL 应该没有区别,除了 beforefieldinit 标志。

我认为如果项目是静态/硬编码的并且不从数据库或其他数据源加载,则第一个很简单。

第二种是使用单例模式,该模式在应用程序中大量使用,其中对象仅创建一次,并在应用程序的整个生命周期中重用该对象引用。 并提供初始化来自任何其他数据源的集合。

结论:两者都很好,但取决于您的需求。 就个人而言,我喜欢第二种方式,因为它遵循设计模式。

最新更新