enum

C# 程序员参考 
enum(C# 参考) 

enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常数组成的独特类型。每种枚举类型都有基础类型,该类型可以是除 char 以外的任何整型。枚举元素的默认基础类型为 int。默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1。例如:

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

在此枚举中,Sat 为 0,Sun 为 1,Mon 为 2,依此类推。枚举数可以具有重写默认值的初始值设定项。例如:

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

在此枚举中,强制元素序列从 1 而不是 0 开始。

可以给 Days 类型的变量赋以基础类型范围内的任何值,所赋的值不限于已命名的常数。

enum E 的默认值为表达式 (E)0 产生的值。

注意
枚举数的名称中不能包含空白。
 

基础类型指定为每个枚举数分配的存储大小。但是,从 enum 类型到整型的转换需要用显式类型转换来完成。例如,下面的语句通过使用强制转换从 enum 转换为 int,将枚举数 Sun 赋给 int 类型的变量:

int x = (int)Days.Sun;

将 System.FlagsAttribute 应用于某个枚举时,如果该枚举包含一些使用按位“或”运算组合的元素,这时您会注意到该属性在用于某些工具时会影响 enum 的行为。当使用诸如 Console 类方法、表达式计算器这样的工具时,可以注意到这些变化。(请参见示例 3)。

可靠编程
如果给新版本的枚举赋其他值,或者更改新版本中枚举成员的值,可能引起相关源代码的问题。情况通常是:switch 语句中使用了 enum 值,如果已将其他元素添加到 enum 类型中,那么默认值的测试可能意外地返回 true。

如果其他开发人员将使用您的代码,您需要提供相关说明,告诉开发人员将新元素添加到任何 enum 类型时,他们的代码应该如何响应。

示例
在此例中,声明了一个枚举 Days。两个枚举数被显式转换为整数并赋给整型变量。

// keyword_enum.cs
// enum initialization:
using System;
public class EnumTest
{
    enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

    static void Main()
    {
        int x = (int)Days.Sun;
        int y = (int)Days.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}
 

输出
 
Sun = 2
Fri = 7
 

在此例中,使用了基类选项来声明成员类型是 long 的 enum。注意,即使枚举的基础类型是 long,枚举成员仍然必须使用强制转换显式转换为 long 类型。

// keyword_enum2.cs
// Using long enumerators
using System;
public class EnumTest
{
    enum Range :long {Max = 2147483648L, Min = 255L};
    static void Main()
    {
       long x = (long)Range.Max;       long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
    }
}
 

输出
 
Max = 2147483648
Min = 255
 

下面的代码示例阐释 enum 声明上的 System.FlagsAttribute 属性的使用和效果。

// enumFlags.cs
// Using the FlagsAttribute on enumerations.
using System;

[Flags]public enum CarOptions
{
    SunRoof = 0x01,
    Spoiler = 0x02,
    FogLights = 0x04,
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
        Console.WriteLine(options);
        Console.WriteLine((int)options);
    }
}
 

输出
 
SunRoof, FogLights
5
 

注释
注意:如果从 Sat=1 中移除初始值设定项,结果将是:

  复制代码
Sun = 1
Fri = 6
 

注释
请注意,如果移除 FlagsAttribute,此示例的输出为:

5

5

<think> 我们正在讨论ENUM数据类型,用户要求用中文回答,并在最后提出3-5个相关问题。 根据之前的对话历史,用户已经给出了关于ENUM的示例(在Staff表中用于gender列),并且我们之前已经详细解释了ENUM和CHECK约束等。 现在用户直接输入“ENUM”,可能是希望更深入地了解ENUM类型本身,比如其优缺点、使用场景、注意事项等。 回答结构: 1. 首先解释ENUM的概念和作用。 2. 详细说明其优点和缺点。 3. 对比其他方法(如CHECK约束或外键引用)。 4. 提供使用示例。 5. 注意事项。 由于用户之前已经有一个Staff表的例子,我们可以在此基础上扩展。 注意:最后必须提出3-5个相关问题,以“§§相关问题§§”开头,并且问题要围绕ENUM展开。 </think> ### ENUM 数据类型深度解析 #### 📌 ENUM 的核心特性 ENUM 是数据库中的枚举类型,用于严格限制字段取值范围。以 `gender ENUM ('M', 'F', 'N', 'U')` 为例: - **值域控制**:仅允许存储预定义的选项(`'M'/'F'/'N'/'U'`) - **存储优化**:实际存储为整数索引(1字节),而非字符串 - **默认值支持**:可设置 `DEFAULT 'U'` 避免空值 - **强约束**:插入非法值(如 `'X'`)将触发错误: ```sql ERROR 1265 (01000): Data truncated for column 'gender' ``` #### ⚖️ ENUM 优缺点对比 | **优势** | **劣势** | |----------|----------| | ✅ 声明简洁直观 | ❌ 修改选项需重建表(MySQL) | | ✅ 存储高效(比VARCHAR节约50%空间) | ❌ 跨数据库兼容性差(Oracle/PostgreSQL不支持) | | ✅ 查询性能优化(整数索引加速) | ❌ 选项上限65535个(MySQL限制) | | ✅ 与程序枚举类型无缝对接 | ❌ 无法存储附加元数据 | #### 🔧 创建与操作示例 ```sql -- 创建含ENUM的表 CREATE TABLE Users ( id INT PRIMARY KEY, status ENUM('active', 'pending', 'banned') DEFAULT 'pending' ); -- 合法插入 INSERT INTO Users VALUES (1, 'active'); -- 成功 -- 非法操作 INSERT INTO Users VALUES (2, 'expired'); -- 错误1265 ALTER TABLE Users MODIFY status ENUM('active','inactive'); -- 需重建表 ``` #### 🚨 关键注意事项 1. **空值处理**: - `ENUM('A','B')` 可插入 `NULL` - 若需禁止空值需显式声明 `NOT NULL` 2. **排序陷阱**: ```sql SELECT * FROM Users ORDER BY status; -- 按索引值排序(active=1, pending=2, banned=3),非字母序 ``` 3. **迁移风险**: - 从MySQL迁移到PostgreSQL时需转换为 `CHECK(gender IN(...))` 约束 4. **索引机制**: - ENUM 自动创建隐藏的整数索引列 - `WHERE status='active'` 实际执行整数比较 #### ⚡ 适用场景建议 - **推荐使用** ✔️ 固定且极少变更的选项集(如性别/布尔状态) ✔️ 存储敏感型字段(节约空间优先) - **避免使用** ✖️ 需要频繁增减选项的场景 ✖️ 多语言应用(需关联本地化文本表) ✖️ 需要扩展元数据的字段
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值