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

时间:2012-06-22 09:00:21

标签: c# collections

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

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();
      }
   }
}

更好的解决方案?为什么呢?

3 个答案:

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

如果您需要类似的静态全局集合,则可以提取公共通用基类以提供GetByIdGetByName或类似方法。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

结论:两者都很好,但取决于你需要什么。我个人喜欢第二种方式,因为它遵循设计模式。