什么是枚举,我们在哪里可以使用它?

时间:2016-07-19 20:33:59

标签: c#

虽然我每次使用List<T>stringbool等时都会进行编码。我在任何地方都看不到使用enum.我有个主意enum是一个常数,但在实践中,我们实际上在哪里使用它。如果可以,我们可以使用

public const int x=10; 

我们在哪里实际使用它?

请帮助我

4 个答案:

答案 0 :(得分:5)

const map = f => { const mapF = acc => ([head, ...tail]) => head === undefined ? acc : mapF([...acc, f(head)])(tail); return mapF([]); }; 是使用名称而不是数字的便捷方式,以表示某些内容。它使您的代码比使用数字更具可读性和可维护性。例如,让我们说1是红色,2是绿色。以下内容更具可读性:

enum

或者这个:

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

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

enum Color { Red, Green}

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

答案 1 :(得分: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.

它是一个小细节,但它标志着我们的意图并阻止我们在多个地方存储价值。

答案 2 :(得分:1)

假设您需要在具有角色的软件中标记用户,那么您可以声明枚举来定义这些角色,对于示例:

public enum UserRole
{
   Master = 1,

   Developer = 2,

   Tester = 3,

   Manager = 4
}

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

您可以实现以下内容:

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;
}

答案 3 :(得分:0)

只需在枚举上添加更多内容:枚举器命名为常量。如果在应用程序中使用一组命名常量,则可以使用枚举而不是对这些常量进行硬编码。每个枚举类型都有一个基础类型,除了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