前言
在 .NET 框架中,主要包括值類型、引用類型等,在某些情況下,我們需要用可讀性強(qiáng)的符號名稱,代替硬編碼的數(shù)值。從而提高代碼可讀性。在 C# 中,可以是使用枚舉的值類型來實(shí)現(xiàn),本文將了解枚舉實(shí)現(xiàn)的幾種示例。
枚舉(Enum)
1、概述
枚舉(enum)是.NET 提供的一種值類型,由一組可以命名常量定義整型數(shù)值類型的一種方法。由基礎(chǔ)整數(shù)值類型的一組命名常量組成。枚舉常用于多項(xiàng)選擇的場景,如表示一周中的一天、訂單狀態(tài)(待支付、已支付、已完成)、用戶狀態(tài)(激活、凍結(jié)、已刪除)等。
C# 使用關(guān)鍵字 enum 定義枚舉成員的名稱,語法如下面代碼:
2、特點(diǎn)
增強(qiáng)可讀性與可維護(hù)性:由于枚舉允許對整型常量使用描述性名稱,從而使用的代碼更清晰、可讀性也更強(qiáng)。
確保類型安全性:枚舉可以在編譯期間提供類型安全性,將值分配給該枚舉類型的預(yù)定義常量集中的變量。
編譯器對類型檢查:編譯器可對枚舉值進(jìn)行類型檢查,確保僅使用有效的枚舉常量。
支持智能感知:在使用集成開發(fā)環(huán)境時(shí),可通過智能感知查看可用枚舉值及其描述的列表。
與switch結(jié)合使用:枚舉非常適合與 switch 語句一起使用,從而能夠創(chuàng)建更簡潔、更結(jié)構(gòu)化的代碼來處理多個(gè)情況。
降低錯(cuò)誤風(fēng)險(xiǎn):由于枚舉常量在編譯期間會得到驗(yàn)證,因此降低了因拼寫錯(cuò)誤或值不正確而導(dǎo)致錯(cuò)誤的可能性。
3、優(yōu)勢
使用枚舉可增強(qiáng)類型安全性;
枚舉可以迭代;
?
注意:在枚舉中,分配給其成員的數(shù)值可以屬于任何整數(shù)數(shù)據(jù)類型,如 byte、int、short、long、ushort等。默認(rèn)情況下,枚舉成員為 int 類型。
示例
1、 定義枚舉類型,未對枚舉的成員分配任何值時(shí),則默認(rèn)為第一個(gè)成員分配值0,其后成員值將遞增1。
public enum UserStatus
{
/// <summary>
/// 活動
/// </summary>
Activity,
/// <summary>
/// 已阻止
/// </summary>
Blocked,
/// <summary>
/// 已刪除
/// </summary>
Deleted,
/// <summary>
/// 不活動
/// </summary>
Inaction
}
2、 定義枚舉類型時(shí),顯式為成員分配整數(shù)值。
public enum UserStatus
{
/// <summary>
/// 活動
/// </summary>
Activity=1,
/// <summary>
/// 已阻止
/// </summary>
Blocked=2,
/// <summary>
/// 已刪除
/// </summary>
Deleted=3,
/// <summary>
/// 不活動
/// </summary>
Inaction=4
}
3、為每個(gè)成員分配各種值時(shí),修改 enum 成員的默認(rèn)值將導(dǎo)致其他成員按順序自動分配增量值
public enum UserStatus
{
/// <summary>
/// 活動
/// </summary>
Activity, // =0
/// <summary>
/// 已阻止
/// </summary>
Blocked, // =1
/// <summary>
/// 已刪除
/// </summary>
Deleted=5,
/// <summary>
/// 不活動
/// </summary>
Inaction // =6
}
4、為枚舉的每個(gè)成員分配不同的值
public enum UserStatus
{
/// <summary>
/// 活動
/// </summary>
Activity, // =0
/// <summary>
/// 已阻止
/// </summary>
Blocked, // =1
/// <summary>
/// 已刪除
/// </summary>
Deleted=5,
/// <summary>
/// 不活動
/// </summary>
Inaction // =6
}
5、與 switch 語句組合使用
namespace Fountain.WinConsole.EnumDemo
{
internal class Program
{
static void Main(string[] args)
{
UserStatus userStatus = UserStatus.Activity;
switch (userStatus)
{
case UserStatus.Activity:
break;
case UserStatus.Inaction:
break;
case UserStatus.Deleted:
break;
default:
break;
}
Console.ReadKey();
}
}
}
6、使用 GetNames 方法遍歷所有值
namespace Fountain.WinConsole.EnumDemo
{
internal class Program
{
static void Main(string[] args)
{
foreach (string enumName in Enum.GetNames(typeof(UserStatus)))
{
Console.WriteLine(enumName);
}
Console.ReadKey();
}
}
}
// 輸出結(jié)果
Activity
Blocked
Deleted
Inaction
7、使用 GetValues 方法遍歷所有值
namespace Fountain.WinConsole.EnumDemo
{
internal class Program
{
static void Main(string[] args)
{
foreach (UserStatus status in Enum.GetValues(typeof(UserStatus)))
{
Console.WriteLine(status.ToString());
}
Console.ReadKey();
}
}
}
// 輸出結(jié)果
Activity
Blocked
Deleted
Inaction
8、在枚舉類型的定義中包含典型組合
使用枚舉類型表示選項(xiàng)的組合,需將每個(gè)選項(xiàng)的枚舉成員定義為位字段,且關(guān)聯(lián)值應(yīng)該是2的冪。然后可以使用按位邏輯運(yùn)算符組合選擇或交叉選擇組合。聲明枚舉類型的位域,需使用Flags屬性。namespace Fountain.WinConsole.EnumDemo
{
internal class Program
{
static void Main(string[] args)
{
UserStatus userStatus = UserStatus.Blocked | UserStatus.Deleted | UserStatus.Inaction;
// 輸出 Blocked Deleted Inaction
Console.WriteLine($"不可用狀態(tài){userStatus}");
UserStatus invalidStatus = UserStatus.Blocked | UserStatus.Inaction;
// 輸出 Blocked Inaction
Console.WriteLine($"受阻或不活動的 {invalidStatus}");
Console.ReadKey();
}
}
[Flags]
public enum UserStatus
{
/// <summary>
/// 活動
/// </summary>
Activity= 0b_0000_0000, // 0
/// <summary>
/// 已阻止
/// </summary>
Blocked= 0b_0000_0001, // 1
/// <summary>
/// 已刪除
/// </summary>
Deleted= 0b_0000_0010, // 2
/// <summary>
/// 不活動
/// </summary>
Inaction= 0b_0000_0100 //4
}
}
9、使用屬性向枚舉值添加說明【.NET Framework 4.7 以上】
using System.ComponentModel;
namespace Fountain.WinConsole.EnumDemo
{
internal class Program
{
static void Main(string[] args)
{
UserStatus status = UserStatus.Deleted;
var field = status.GetType().GetField(status.ToString());
var attribute = (DescriptionAttribute)Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
string attributeName = attribute == null ? status.ToString() : attribute.Description;
// 輸出已刪除
Console.WriteLine(attributeName);
//
Console.ReadKey();
}
}
public enum UserStatus
{
/// <summary>
/// 活動
/// </summary>
[Description("活動")]
Activity,
/// <summary>
/// 已阻止
/// </summary>
[Description("已阻止")]
Blocked,
/// <summary>
/// 已刪除
/// </summary>
[Description("已刪除")]
Deleted,
/// <summary>
/// 不活動
/// </summary>
[Description("不活動")]
Inaction
}
}
小結(jié)
以上是枚舉的八種示例,希望本文對您有所收獲,如有不到之處,請多多包涵。
該文章在 2024/11/18 9:07:18 編輯過