常量让我们可以在代码中的某个位置定义一个值的名称。
枚举就像定义一组常量,让我们声明变量、属性和参数,这些变量、属性和参数只能使用其中一个常量。
例如,假设我们有一个SalesOrder 类用于我们在网站上收到的订单,每个SalesOrder 都可以有一个状态——可能是新的、已发货、已取消等。
我们可以这样做:
public class SalesOrder
{
public string OrderStatus {get;set;}
但是有人可以将该属性设置为完全无效的东西,例如
order.OrderStatus = "Hello!";
我们可以决定给每个状态一个数字,以防止有人使用一些疯狂的值。所以我们把它改成
public class SalesOrder
{
public int OrderStatusCode {get;set;}
我们决定 1 = 新品,2 = 已发货,3 = 已取消,等等。但这仍然不能解决任何问题,因为有人可以设置 OrderStatusCode = -666,但我们仍然一团糟。
在任何一种情况下,我们都可以使用常量来改进这一点,例如
const string SHIPPED_ORDER_STATUS = "Shipped";
或
const int NEW_ORDER_STATUS_CODE = 1;
但这仍然不能真正解决问题。它可以帮助我们做到这一点:
order.OrderStatusCode = NEW_ORDER_STATUS_CODE;
这很好。但它仍然不能阻止这一点:
order.OrderStatusCode = 555; //No such order status code!
enum 让我们这样做:
public enum OrderStatuses
{
New,
Shipped,
Canceled
}
public class SalesOrder
{
public OrderStatuses OrderStatus {get;set;}
现在不可能将OrderStatus 设置为任何无效值。只能是OrderStatuses中的值之一。
比较也变得容易多了。而不是
if(string.Equals(order.OrderStatus,"shipped",Ordinal.IgnoreCase))
或
if(order.OrderStatusCode == 3) //What does three mean? Magic number!
我们可以的
if(order.OrderStatus == OrderStatuses.Shipped)
现在它更易于阅读且更易于维护。编译器将阻止使用任何无效值。如果您决定要更改 OrderStatuses 中的值的名称,您只需右键单击并重命名它。 string 或 int 无法做到这一点。
所以enum 在这种情况下非常有用 - 如果我们想要一个具有有限的预定义值集的类型。
常量最常见的用途是我们在代码中放置一个重复或没有明显含义的字符串或数字,例如
if(myString.Length > 434) //What is 434? Why do I care if it's more than 434?
我们可以声明一个常量
const int MAX_FIELD_LENGTH = 434;
现在这是有道理的:
if(myString.Length > MAX_FIELD_LENGTH) //Now it's obvious what this check is for.
这是一个小细节,但它表明了我们的意图,并阻止我们将值存储在多个位置。