枚举的设计指南

时间:2010-06-23 20:12:51

标签: c# validation enumeration

在其中一个财务Winform项目中,应用程序代码必须使用货币等值。在表示业务实体的对象模型中,有些字段需要保存货币值,如美元,欧元等。此字段的值集很可能仅限于其中一种标准货币,很少需要扩大新货币。应用程序从GUI控件获取货币输入,该控件从另一个标准源获取这些值并显示为下拉列表,尽管用户可能直接将值输入控件。应用程序的逻辑并不特别依赖于货币的值,也不会直接对这些字段执行特殊处理,这需要引用字段中包含的实际值。

现在提出一个问题:是否建议使用枚举,枚举诸如美元,欧元等的值,以便可以针对枚举验证接收到代码中的货币值?如果没有,是否建议将货币值从下拉列表中输入,以便代码中不需要额外的验证?

4 个答案:

答案 0 :(得分:0)

如果代码没有处理货币值,并且以后可以添加新的货币值,那么我将货币值编码为(数据)字符串而不是(硬编码的)枚举值。

答案 1 :(得分:0)

由于您具有有限且固定的可能值集,因此枚举或预先填充的下拉列表比允许用户输入自己的值更好。 (枚举可能更有效,因为如果您的货币少于256种,它可以存储在一个字节中)。另一种方法(如果您设想有一天可能需要添加另一种货币)将填充XML配置文件或数据库表中的drpo-down,以便它是数据驱动的并且可以轻松扩展(而不是需要重建应用程序以支持新货币)

如果您计划对代码进行模糊处理,请注意枚举类型 - 一旦被篡改,就无法将枚举值转换为文本(因为它们将被“加扰”),因此您无法再使用反射来在枚举值和文本之间进行转换(用于填充UI控件和/或序列化为文本格式)

答案 2 :(得分:0)

IMO您应该使用允许的值创建枚举并验证输入。原因是因为您可能有一个带有下拉列表的接口,但没有什么可以阻止其他接口使用简单的文本条目。

答案 3 :(得分:0)

我建议您为货币创建一个简单的类或事件结构,并为当前定义的货币创建一些静态只读成员:

class Currency
{
     public static reaonly IEnumerable<Currency> Currencies = new List<Currency>
     {
         new Currency { Name = "USD", CurrencySign = "$" },
         new Currency { Name = "EUR", CurrencySign = "€" }
     }

     public string Name {get; private set;}

     public string CurrencySign {get; private set;}

     public override ToString() { return Name; }
}

它允许您轻松扩展货币列表并将其从其他位置提取,然后从静态成员(如数据库或Web服务)中提取,而无需重新设置应用程序。