0

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

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

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

4

3 回答 3

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];
    }
}

由于类型安全,这将导致代码不易出错,因为您可以编写带有 type 参数的方法ErrorValue

void HandleError(ErrorValue ev)
{ 
    // bla bla
}

另一个好处是,使用这种方法,您可以轻松地扩展类型;例如添加其他属性,例如Description,无需对您的代码进行重大更改。

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

于 2012-06-22T09:17:08.113 回答
1

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

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

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

于 2012-06-22T09:05:50.803 回答
1

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

于 2012-06-22T09:04:35.310 回答