13

所以我正在查看一些签入的代码,我很困惑:

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

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

private static int CANCELLATION_LIMIT = 2;

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

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

4

7 回答 7

12

返回“它在逻辑上是一组值”吗?“枚举是合适的”:“静态常量很好”

(我是逻辑一致的忠实粉丝)

于 2009-01-29T10:39:19.637 回答
8

枚举类型。

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

enum OrderState 
{
  pending = 1,
  shipped = 2
}

public IList<Order> GetOrdersInState( OrderState )
{
}

这是一个很好的例子——恕我直言——使用枚举。当 OrderState 是您为其创建 2 个 const int 的 int 时,您没有任何限制并且能够传递无效值。编译器不会抱怨。

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

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

于 2009-01-29T10:39:32.757 回答
2

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

于 2009-01-29T10:40:19.777 回答
1

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

对于不同的东西,如果它是一个const,那么也许......但目前它是一个可变字段?

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

于 2009-01-29T10:42:11.037 回答
1

对于旨在唯一的不可变值,枚举是要走的路。要问的问题很简单:对象是否应该存储值本身,甚至是静态的?在许多情况下,例如在描述错误或操作时,答案是否定的。请记住,enum是作为#define的替代品而诞生的:它将典型值与标识符相关联并提供了一种类型,它实际上并没有说“在此处存储此常量”。

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

于 2009-01-29T10:45:23.073 回答
0

如果您有一组直接连接的值,我认为您应该使用枚举。

类似于:枚举状态 { Open = 1, Closed =2, Waiting=3 };

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

于 2009-01-29T10:38:48.577 回答
0

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

但是,可能会有妥协:使用 private const CANCELLATION_LIMIT = 2; 你们俩都应该高兴。对他来说,类 (?) 将没有全局变量,因为 const 将被编译器替换,并且您将获得具有明确名称的单点更改。

于 2009-01-29T10:39:14.113 回答