【问题标题】:what is enum and where can we use it?什么是枚举,我们可以在哪里使用它?
【发布时间】:2016-07-19 20:33:58
【问题描述】:

虽然我每次使用List<T>stringbool 等都在编码。我没有看到任何使用enum. 的地方我知道enum 是一个常数,但在实践中,我们在哪里实际使用它。如果我们可以使用一个

public const int x=10; 

我们实际在哪里使用它?

请帮帮我

【问题讨论】:

  • 既然可以使用枚举,为什么还要使用public const int x=10
  • 类似话题讨论here
  • 枚举是一种命名数字。
  • enum (C# Reference) 他们在那个站点隐藏了很多有用的信息

标签: c#


【解决方案1】:

enum 是一种使用名称而不是数字来表示某事的便捷方式。它使您的代码比使用数字更具可读性和可维护性。例如,假设我们说 1 是红色,2 是绿色。以下内容更具可读性:

if(color == 1)
{
    Console.WriteLine("Red");
}
if(color == 2)
{
    Console.WriteLine("Green");
}

或者这个:

enum Color { Red, Green}

if(color == Color.Red)
{
    Console.WriteLine("Red");
}
if(color == Color.Green)
{
    Console.WriteLine("Green");
}

此外,让您在代码库中的 20 个位置进行上述检查,并且出于某种原因,您必须将 Red 的值从 1 更改为 3,将 Green 的值从 2 更改为 5。如果您遵循第一种方法,那么您将不得不在 20 处将 1 更改为 3 和 2 更改为 5 !如果您遵循第二种方法,则以下内容就足够了:

enum Color { Red = 3 , Green = 5 }

【讨论】:

  • 这有助于我消除困惑。谢谢@Christos
【解决方案2】:

常量让我们可以在代码中的某个位置定义一个值的名称。

枚举就像定义一组常量,让我们声明变量、属性和参数,这些变量、属性和参数只能使用其中一个常量。

例如,假设我们有一个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 中的值的名称,您只需右键单击并重命名它。 stringint 无法做到这一点。

所以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.

这是一个小细节,但它表明了我们的意图,并阻止我们将值存储在多个位置。

【讨论】:

    【解决方案3】:

    假设您需要在软件中使用角色标记用户,那么您可以声明一个枚举来定义这些角色,例如:

    public enum UserRole
    {
       Master = 1,
    
       Developer = 2,
    
       Tester = 3,
    
       Manager = 4
    }
    

    然后,您可以在 User 实体中使用此类型 UserRole。它作为整数值工作,但比整数更易读。

    你可以这样实现:

    if (user.Role == UserRole.Master) {
       // some action for master
    } else if (user.Role == UserRole.Developer) {
       // another action for developer
    }
    

    switch (user.Role)
    {
       case UserRole.Master:
          // some action for master
          break;
       case UserRole.Developer:
          // some action for developer
          break;
       case UserRole.Tester:
          // some action for tester
          break;
       case UserRole.Manager:
          // some action for manager
          break;
    }
    

    【讨论】:

      【解决方案4】:

      只是在枚举上添加一点点:枚举器被命名为常量。如果您在应用程序中使用一组命名常量,则可以使用枚举而不是对这些常量进行硬编码。每个枚举类型都有一个底层类型,它可以是除 char 之外的任何整数类型。枚举元素的默认基础类型是 int。但是你可以改变默认类型。

       enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
      

      默认情况下,第一个枚举数的值为 0,随后每个枚举数的值都增加 1。例如,在以下枚举中,Sat 为 0,Sun 为 1,Mon 为 2,以此类推。您可以更改第一个值

      enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
      

      元素序列被强制从 1 开始,而不是 0。

      您可以更改枚举的默认类型,但必须是任何整数类型。

      enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
      

      实际场景 您可以创建项目任务状态的枚举

      public enum Status
              {
                  started,
                  completed,
                  notstarted
              }  
      

      你可以像使用枚举一样

      Status.started
      

      【讨论】:

        猜你喜欢
        • 2011-04-09
        • 2015-09-02
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        相关资源
        最近更新 更多