【问题标题】:Class; Struct; Enum confusion, what is better?班级;结构;枚举混乱,什么更好?
【发布时间】:2011-02-18 01:02:20
【问题描述】:

我有 46 行信息,每行 2 列(“代码”、“描述”)。这些代码将根据其初始提交请求的成功或失败返回给客户端。我不想使用数据库文件(csv、sqlite 等)进行存储/访问。对于我希望如何向客户端显示这些代码,我能想到的最接近的类型是异常类。如果我错了,请纠正我,但据我所知,枚举不允许使用字符串,尽管这种结构最初基于其工作方式似乎是更好的选择(例如 100 = “请求中缺少名称”)。

想一想,创建一个班级可能是最好的作案手法。不过,如果遇到类似情况的人提供更有经验的建议或指导和意见,我将不胜感激。

目前这是我所拥有的:

    class ReturnCode
{
    private int _code;
    private string _message;

    public ReturnCode(int code)
    {
        Code = code;
    }

    public int Code
    {
        get
        {
            return _code;
        }
        set
        {
            _code = value;
            _message = RetrieveMessage(value);
        }
    }

    public string Message { get { return _message; } }

    private string RetrieveMessage(int value)
    {
        string message;

        switch (value)
        {
            case 100:
                message = "Request completed successfuly";
                break;
            case 201:
                message = "Missing name in request.";
                break;
            default:
                message = "Unexpected failure, please email for support";
                break;
        }

        return message;
    }

}

【问题讨论】:

    标签: c# class return-value messages


    【解决方案1】:

    最好的方法是类和枚举。然后你可以有比“201”更多的描述性标识符。

    结构也可以,但它们更难正确实现,所以你应该坚持使用一个类,除非你出于某种原因特别需要一个结构。

    您不需要在类中存储对消息的引用,您可以在需要时在Message 属性中获取它。一个switch是使用哈希表实现的(如果有五个或更多的值),所以查找速度非常快。

    public enum ReturnIdentifier {
      Success = 100,
      MissingName = 201;
    }
    
    public class ReturnCode {
    
      public ReturnIdentifier Code { get; private set; }
    
      public ReturnCode(ReturnIdentifier code) {
        Code = code;
      }
    
      public string Message {
        get {
          switch (Code) {
            case ReturnIdentifier.Success:
              return "Request completed successfuly.";
            case ReturnIdentifier.MissingName:
              return "Missing name in request.";
            default:
              return "Unexpected failure, please email for support.";
          }
        }
      }
    
    }
    

    用法:

    ReturnCode code = new ReturnCode(ReturnIdentifier.Success);
    

    如果你从某个地方得到一个整数代码,你仍然可以使用它作为枚举值对应的代码:

    int error = 201;
    ReturnCode code = new ReturnCode((ReturnIdentifier)error);
    

    (如果整数代码不对应枚举中的任何标识符,则进行转换仍然完全有效。当获取Message值时,它将以default的情况结束值不匹配任何其他情况。)

    【讨论】:

    • 这就是我要找的。你的推理很清楚,并提供了简单的例子。我不能要求更好的回应。非常感谢您的帮助。
    【解决方案2】:

    我认为选择一门课程(就像您所做的那样)是一个不错的决定。如果您使用Dictionary<int, string> 将代码映射到描述,您可以使代码更加紧凑和可读。

    _dict.Add(100, "Description1");
    _dict.Add(201, "Description2");
    ...............................
    

    还有RetrieveMessage:

    return _dict[value];
    

    【讨论】:

      【解决方案3】:

      如何从 Dictionary 派生,或者使用可以索引的 Dictionary 字段将数据表存储在代码中?

      【讨论】:

        【解决方案4】:

        也许基于字典的方法看起来更优雅。

            private static Dictionary<int, string> errorCodes = 
            new Dictionary<int, string>()
            {
                {100, "Request completed successfuly"},
                {200, "Missing name in request."}
            };
        
            private string RetrieveMessage(int value)
            {
                string message;
                if (!errorCodes.TryGetValue(value, out message))
                    message = "Unexpected failure, please email for support";
        
                return message;
            }
        

        【讨论】:

          【解决方案5】:

          肯定会更慢(因为它使用反射),但说到紧凑,我认为Enums With Custom Attributes 适合这种需求。请继续阅读 cmets,因为那里提到了 DescriptionAttribute。类似的东西;

          public enum ErrorMessage
          {
              [System.ComponentModel.Description("Request completed successfuly")]
              Success = 100,
              [System.ComponentModel.Description("Missing name in request.")]
              MissingName = 201
          };
          
          public static string GetDescription(this Enum en)
          {
              Type type = en.GetType();
          
              System.Reflection.MemberInfo[] memInfo = type.GetMember(en.ToString());
          
              if (memInfo != null && memInfo.Length > 0)
              {
                  object[] attrs = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute),
                          false);
          
                  if (attrs != null && attrs.Length > 0)
                      return ((System.ComponentModel.DescriptionAttribute)attrs[0]).Description;
              }  
          
              return en.ToString();
          }
          
          static void Main(string[] args)
          {
              ErrorMessage message = ErrorMessage.Success;
              Console.WriteLine(message.GetDescription());
          }
          

          【讨论】:

            猜你喜欢
            • 2016-11-26
            • 1970-01-01
            • 1970-01-01
            • 2013-07-07
            • 2011-07-06
            • 2013-05-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多