静态变量应该用枚举替换吗?

时间:2009-01-29 10:32:34

标签: c# enums static-members

所以我查看了一些已签入的代码,我对此感到困惑:

// Amount of days before cancellation can't be done
enum Cancellation { Limit = 2 };

询问检查它的人他认为使用枚举而不是静态变量要好得多,比这更好:

private static int CANCELLATION_LIMIT = 2;

所以我们开始争论。我的论点是他使用枚举作为存储值的方法(如果有两个具有相同值的枚举符号,它将会中断)。他认为在一个类中有静态变量是反模式。

我的问题是应该采用哪种最佳做法?

7 个答案:

答案 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,那么也许......但是目前它是一个可变的字段?

请注意,枚举仅限于基于整数的类型,因此不能用于floatstring等。

答案 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会被编译器取代,你将获得一个明确名称的单点变化。