我开始研究一个大的c#代码库,发现使用了一个带有几个const int字段的静态类。这个类的行为与枚举完全相同。
我想把这个类转换成一个实际的枚举,但权力却说不了。我想转换它的主要原因是我可以将枚举作为数据类型而不是int。这对可读性有很大帮助。
有没有理由不使用枚举并使用const int代替? 目前这是代码的方式:
public int FieldA { get; set; }
public int FieldB { get; set; }
public static class Ids
{
public const int ItemA = 1;
public const int ItemB = 2;
public const int ItemC = 3;
public const int ItemD = 4;
public const int ItemE = 5;
public const int ItemF = 6;
}
但是,我认为应该是以下内容:
public Ids FieldA { get; set; }
public Ids FieldB { get; set; }
答案 0 :(得分:6)
我认为这里的许多答案都忽略了enums
语义的含义。
当事先知道所有有效值(Ids)的整个集合并且小到足以在程序代码中声明时,您应该考虑使用枚举。
当已知值的集合是所有可能值的子集时,您应该考虑使用int - 并且代码只需要知道此子集。
关于重构 - 当时间和业务限制允许时,当新设计/实现比先前的实现具有明显优势并且风险得到充分理解时,清理代码是个好主意。在利益低或风险高(或两者兼而有之)的情况下,采取“不伤害”的立场可能更好,而不是“持续改善” 。只有你能够判断哪种情况适用于你的情况。
顺便说一句,既不枚举或常量整数的情况也是一个好主意,当ID代表外部商店中记录的标识符时(如数据库)。在程序逻辑中对这些ID进行硬编码通常是有风险的,因为这些值在不同的环境中实际上可能是不同的(例如,测试,开发,生产等)。在这种情况下,在运行时加载值可能是更合适的解决方案。
答案 1 :(得分:3)
您建议的解决方案看起来很优雅,但不会按原样运行,因为您无法使用静态类型的实例。它比模拟枚举有点棘手。
为实现选择enum或const-int有几个可能的原因,虽然我不能想到你发布的实际例子有很多强大的 - 从表面来看,它似乎是一个理想的候选者为枚举。
一些想到的想法是:
<强>枚举强>
<强>常量-整数强>
为什么要单独执行该实施?
答案 2 :(得分:1)
如果没有损坏,请不要修复它。
我不知道您正在处理的系统的设计,但我怀疑这些字段是恰好恰好具有许多预定义值的整数。也就是说,在未来某个状态下,它们可能包含超过这些预定义值。虽然enum
允许该场景(通过强制转换),但它意味着只有枚举包含的值才有效。
总的来说,这种变化是一种语义变化,但这是不必要的。像这样的不必要的变化通常是错误的来源,额外的测试开销和其他令人头疼的问题,只有轻微的好处。我说添加评论表示这可能是enum
并保持不变。
答案 3 :(得分:0)
是的,它确实有助于提高可读性,而且我不能想出任何反对它的理由。
使用const int是C ++编程实践的一个非常常见的“旧学校”。
答案 4 :(得分:0)
我看到的原因是,如果你想与另一个使用相同常量的系统松散耦合,你就可以避免紧密耦合并共享相同的枚举类型。
就像在RPC调用中一样......