2009-01-29 71 views
13

所以我一直在寻找这是在查了一些代码,我得到了所有困惑了:应该用静态变量替换枚举吗?

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

问起是谁检查了在他认为,这是更好的使用枚举而不是静态变量,bettern比家伙这:

private static int CANCELLATION_LIMIT = 2; 

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

我的问题是什么最佳实践应该用于?

+0

“如果有两个具有相同值的枚举符号,它会中断” - 否,它不会 - 在同一个定义中,您可以使用相同值具有多个枚举。无论哪种方式,它应该是`const`。 – 2009-01-29 10:43:23

回答

8

枚举被键入。

也就是说,如果你有一个方法,你必须将某个'状态'传递给一个方法,你只能传递'有效'参数。 例如:

enum OrderState 
{ 
    pending = 1, 
    shipped = 2 
} 

public IList<Order> GetOrdersInState(OrderState) 
{ 
} 

这是-imho-使用枚举的一个很好的例子。 当OrderState是您为其创建2个常量整数的整型时,您没有任何限制,并且能够传递无效值。编译器不会抱怨。

但是,你提出的情况下,我认为使用枚举不是一个有效的解决方案。这是对int的滥用,应该使用const int。

枚举是好的,但它们应该用在他们必须使用的地方。在任何情况下,它们都不是首选工具。 在这种情况下,const或static var不是反模式。

+0

重构并不像枚举那么容易,例如如果你选择由于要求取消限制取决于数据库条目,因此要使静态为实例方法... – Llyle 2009-01-29 10:44:53

0

我认为你应该使用枚举,如果你有一组直接连接的值。例如:enum Status {Open = 1,Closed = 2,Waiting = 3};

对于其他一切,我会说静态变量是要走的路。

0

我不知道在类(?)中使用静态变量是一种反模式。例如,.Net框架中的Color类有很多静态公共变量,例如Color.Red。所以,从这个角度来看,我会同意你的看法。

但是,可能会有一个折衷:使用私人常量CANCELLATION_LIMIT = 2;而你们两个都应该很开心。对他来说,类(?)将不会有全局变量,因为常量将被编译器替换,并且您将得到一个明确名称的单点更改。

12

return“它在逻辑上是一组值吗”? “ENUM是适当的”:“静态常量是好的”

(我是逻辑一致的大风扇)

+0

绝对同意,100%。 C#中的 – 2009-01-29 11:12:29

+0

我不认为你可以有一个静态常量。它的任一常量,或静态只读:) – Svish 2009-01-29 11:33:55

+1

事实上,所有常量都是隐式静态的,并且禁止显式指定(尽管静态只读,我会很好) – annakata 2009-01-29 11:41:09

2

不,你如何在枚举中定义静态字符串变量或十进制值?

1

我不认为CANELLATION_LIMIT听起来像一个枚举,这通常是一组选择。

对于不同的东西,如果它是一个const,那么也许......但现在它是一个可变的场?

注意枚举仅限于基于整数的类型,所以它不能被用于floatstring

1

对于打算是唯一不变的值,枚举是要走的路。要问的问题很简单:对象是否应该存储值本身,甚至是静态的?在许多情况下,例如在描述错误或行为时,答案是否定的。请记住,枚举 S为诞生于一个替代的#define:它的典型值与标识符相关联,它提供了一个类型,它实际上并没有说“这店不断在这里。”

我认为你实际上不想存储任何东西,但提供这样的典型值。 static const成员仅当您打算使用它们时才有用,例如,如果您需要通过引用方法来传递它们。