【问题标题】:Should static variables be replaced with enums?静态变量应该用枚举代替吗?
【发布时间】:2009-01-29 10:32:34
【问题描述】:

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

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

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

private static int CANCELLATION_LIMIT = 2;

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

我的问题是应该使用哪种最佳实践?

【问题讨论】:

  • "如果有两个枚举符号具有相同的值,它会中断" - 不,它不会 - 您可以在相同的定义中拥有多个具有相同值的枚举。无论哪种方式,它都应该是const

标签: c# enums static-members


【解决方案1】:

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

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

【讨论】:

  • 在 C# 中我不认为你可以有一个静态常量。它要么是 const,要么是静态只读 :)
  • 事实上所有的 const 都是隐式静态的,并且禁止显式规范(不过我可以使用静态只读)
【解决方案2】:

枚举类型。

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

enum OrderState 
{
  pending = 1,
  shipped = 2
}

public IList<Order> GetOrdersInState( OrderState )
{
}

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

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

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

【讨论】:

  • 并且使用枚举进行重构并不那么容易,例如,如果您选择将静态作为实例方法,因为该取消限制需要依赖于数据库条目...
  • 请注意,可能会传递无效的枚举值:GetOrdersInState((OrderState)99); 将导致传入枚举值 99。如果您提出要求,编译器和运行时很乐意为您执行此操作。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • const 还为这些幻数命名,以便编写更具描述性的代码,而不仅仅是为了重用。 “需要通过引用方法来传递它们”。不,常量原语之类是按值传递的,而不是引用。
      • “静态常量变量”——这不是矛盾吗?
      • 您可以通过引用或地址很好地传递 const。比如: pass_me_an_object_by_addr(&my_const_object);
      • ' “静态常量变量” - 这不是矛盾吗? ' - 是的,改成更好的术语了。
      • @Eduard:我说的是托管 C#
      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-01
          • 2012-03-05
          • 2011-01-14
          • 2010-10-07
          相关资源
          最近更新 更多