前言
在 .NET 框架中,主要包括值類型、引用類型等,在某些情況下,我們需要用可讀性強的符號名稱,代替硬編碼的數值。從而提高代碼可讀性。在 C# 中,可以是使用枚舉的值類型來實現,本文將了解枚舉實現的幾種示例。
枚舉(Enum)
1、概述
枚舉(enum)是.NET 提供的一種值類型,由一組可以命名常量定義整型數值類型的一種方法。由基礎整數值類型的一組命名常量組成。枚舉常用于多項選擇的場景,如表示一周中的一天、訂單狀態(待支付、已支付、已完成)、用戶狀態(激活、凍結、已刪除)等。
C# 使用關鍵字 enum 定義枚舉成員的名稱,語法如下面代碼:
2、特點
增強可讀性與可維護性:由于枚舉允許對整型常量使用描述性名稱,從而使用的代碼更清晰、可讀性也更強。
確保類型安全性:枚舉可以在編譯期間提供類型安全性,將值分配給該枚舉類型的預定義常量集中的變量。
編譯器對類型檢查:編譯器可對枚舉值進行類型檢查,確保僅使用有效的枚舉常量。
支持智能感知:在使用集成開發環境時,可通過智能感知查看可用枚舉值及其描述的列表。
與switch結合使用:枚舉非常適合與 switch 語句一起使用,從而能夠創建更簡潔、更結構化的代碼來處理多個情況。
降低錯誤風險:由于枚舉常量在編譯期間會得到驗證,因此降低了因拼寫錯誤或值不正確而導致錯誤的可能性。
3、優勢
?
注意:在枚舉中,分配給其成員的數值可以屬于任何整數數據類型,如 byte、int、short、long、ushort等。默認情況下,枚舉成員為 int 類型。
示例
1、 定義枚舉類型,未對枚舉的成員分配任何值時,則默認為第一個成員分配值0,其后成員值將遞增1。
public enum UserStatus
{
/// <summary>
/// 活動
/// </summary>
Activity,
/// <summary>
/// 已阻止
/// </summary>
Blocked,
/// <summary>
/// 已刪除
/// </summary>
Deleted,
/// <summary>
/// 不活動
/// </summary>
Inaction
}
2、 定義枚舉類型時,顯式為成員分配整數值。
public enum UserStatus
{
/// <summary>
/// 活動
/// </summary>
Activity=1,
/// <summary>
/// 已阻止
/// </summary>
Blocked=2,
/// <summary>
/// 已刪除
/// </summary>
Deleted=3,
/// <summary>
/// 不活動
/// </summary>
Inaction=4
}
3、為每個成員分配各種值時,修改 enum 成員的默認值將導致其他成員按順序自動分配增量值
public enum UserStatus
{
/// <summary>
/// 活動
/// </summary>
Activity, // =0
/// <summary>
/// 已阻止
/// </summary>
Blocked, // =1
/// <summary>
/// 已刪除
/// </summary>
Deleted=5,
/// <summary>
/// 不活動
/// </summary>
Inaction // =6
}
4、為枚舉的每個成員分配不同的值
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();
}
}
}
// 輸出結果
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();
}
}
}
// 輸出結果
Activity
Blocked
Deleted
Inaction
8、在枚舉類型的定義中包含典型組合
使用枚舉類型表示選項的組合,需將每個選項的枚舉成員定義為位字段,且關聯值應該是2的冪。然后可以使用按位邏輯運算符組合選擇或交叉選擇組合。聲明枚舉類型的位域,需使用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($"不可用狀態{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
}
}
小結
以上是枚舉的八種示例,希望本文對您有所收獲,如有不到之處,請多多包涵。
該文章在 2024/11/18 9:07:18 編輯過