什么是枚举,我们可以在哪里使用它
本文关键字:在哪里 枚举 我们 什么 | 更新日期: 2023-09-27 17:57:39
虽然我每次使用List<T>
、string
、bool
等时都编码。我没有看到任何地方使用enum.
我有一个想法,enum
是一个常数,但在实践中,我们实际在哪里使用它。如果有的话,我们可以只使用
public const int x=10;
我们在哪里实际使用它?
请帮助我
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");
}
此外,让你在代码库中的二十个地方进行上述检查,并且出于某种原因,你必须将红色的值从 1 更改为 3,将绿色的值从 2 更改为 5。如果您遵循第一种方法,那么您将不得不在 20 个地方将 1 更改为 3 和 2 更改为 5!如果您遵循第二种方法,则以下内容就足够了:
enum Color { Red = 3 , Green = 5 }
常量允许我们在代码中的一个位置定义值的名称。
枚举就像定义一组常量,让我们声明只能使用其中一个常量的变量、属性和参数。
例如,假设我们为在网站上收到的订单提供了一个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.
这是一个小细节,但它表明了我们的意图,并阻止我们在多个地方存储值。
假设您需要在软件中使用角色标记用户,那么您可以声明一个枚举来定义这些角色,例如:
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;
}
只是在枚举上添加更多内容:枚举器是命名常量。如果在应用程序中使用一组命名常量,则可以使用枚举,而不是对这些常量进行硬编码。每个枚举类型都有一个基础类型,该类型可以是除 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