所以我查看了一些已签入的代码,我对此感到困惑:
// Amount of days before cancellation can't be done
enum Cancellation { Limit = 2 };
询问检查它的人他认为使用枚举而不是静态变量要好得多,比这更好:
private static int CANCELLATION_LIMIT = 2;
所以我们开始争论。我的论点是他使用枚举作为存储值的方法(如果有两个具有相同值的枚举符号,它将会中断)。他认为在一个类中有静态变量是反模式。
我的问题是应该采用哪种最佳做法?
答案 0 :(得分:12)
返回“它在逻辑上是一组值”吗? “Enum是合适的”:“静态const很好”
(我是逻辑上一致的忠实粉丝)
答案 1 :(得分:8)
键入枚举。
也就是说,如果你有一个方法,你必须将某个'state'传递给一个方法,你只能传递'valid'参数。 例如:
enum OrderState
{
pending = 1,
shipped = 2
}
public IList<Order> GetOrdersInState( OrderState )
{
}
这是一个很好的例子 - 使用枚举的方式。 当OrderState是一个为其创建2个const整数的int时,您没有限制并且能够传递无效值。编译器不会抱怨。
但是,你提出的情况,我认为使用枚举不是一个有效的解决方案。使用int是一种误用,应该使用const int。
枚举很好,但应该在必须使用的地方使用。在任何情况下,它们都不是首选工具。 在这种情况下,使用const或static var不是反模式。
答案 2 :(得分:2)
不,如何在枚举中定义静态字符串变量或小数值?
答案 3 :(得分:1)
我不认为CANELLATION_LIMIT
听起来像枚举,这通常是一组选择。
对于不同的东西,如果它是const
,那么也许......但是目前它是一个可变的字段?
请注意,枚举仅限于基于整数的类型,因此不能用于float
,string
等。
答案 4 :(得分:1)
对于旨在唯一的不可变值,枚举是可行的方法。要问的问题很简单:对象是否应该存储值本身,甚至是静态的?在许多情况下,例如在描述错误或行动时,答案是否定的。请记住, enum 是作为 #define 的替代品诞生的:它将典型值与标识符相关联,它提供了一种类型,实际上并没有说“在此存储此常量” ”
我认为你实际上并不想存储任何东西,而是提供这样的典型值。 static const 成员仅在您打算使用它们时才有用,例如,如果您需要通过引用方法传递它们。
答案 5 :(得分:0)
如果您有一组直接连接的值,我认为您应该使用枚举。
类似:enum Status {Open = 1,Closed = 2,Waiting = 3};
对于其他一切,我会说静态变量是可行的方法。
答案 6 :(得分:0)
我不知道在类(?)中使用静态变量是一种反模式。例如,.Net框架中的Color类有许多静态公共变量,例如Color.Red。所以,从这个角度来看,我会同意你的看法。
然而,可能有一个妥协:使用私有const CANCELLATION_LIMIT = 2;你们两个都应该感到高兴。对于他来说,类(?)没有全局变量,因为consts会被编译器取代,你将获得一个明确名称的单点变化。