枚举
2022/3/11 23:17:26
本文主要是介绍枚举,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
所有枚举从 System.Enum(继承自 System.ValueType)继承。 适用于结构的所有规则也适用于枚举。 C# 程序使用 类型声明 创建新类型。 类型声明指定新类型的名称和成员。 用户可定义以下六种 C# 类型:类类型、结构类型、接口类型、枚举类型、委托类型和元组值类型。 还可以声明 record 类型( record struct 或 record class )。 记录类型具有编译器合成成员。 记录主要用于存储值,关联行为最少。 一.枚举类型 enum E {...} 格式的用户定义类型。 enum 类型是一种包含已命名常量的独特类型。 每个 enum 类型都有一个基础类型(必须是八种整型类型之一)。 enum 类型的值集与基础类型的值 集相同。枚举类型定义了一组常数值。以下enum声明了定义不同根蔬菜的常数:
public enum SomeRootVegetable { HorseRadish, Radish, Turnip }
还可以定义一个 enum 作为标志组合使用。 以下声明为四季声明了一组标志。 可以随意搭配季节组合,包括 All 值(包含所有季节):
public enum Seasons {
None = 0,
Summer = 1,
Autumn = 2,
Winter = 4,
Spring = 8,
All = Summer | Autumn | Winter | Spring
}
var turnip = SomeRootVegetable.Turnip; var spring = Seasons.Spring; var startingOnEquinox = Seasons.Spring | Seasons.Autumn; var theYear = Seasons.All;foreach 语句可用于枚举任何集合的元素。 以下代码从前一个示例中枚举数组:
foreach (int item in a) { Console.WriteLine(item); }可以使用 await foreach 语句来枚举序列:
await foreach (var number in GenerateSequence()) { Console.WriteLine(number); }枚举器的释放方式取决于 enumerator 类型的特征。 在常规同步情况下, finally 子句扩展为:
finally { (enumerator as IDisposable)?.Dispose(); }常规异步情况扩展为:
finally { if (enumerator is IAsyncDisposable asyncDisposable) await asyncDisposable.DisposeAsync(); }但是,如果 enumerator 的类型为已密封类型,并且不存在从类型 enumerator 到 IDisposable 或 IAsyncDisposable 的隐式转换,则 finally 子句扩展为一个空白块:
finally { }如果存在从类型 enumerator 到 IDisposable 的隐式转换,并且 enumerator 是不可为 null 的值类型,则 finally 子句扩展为:
finally { ((IDisposable)enumerator).Dispose(); }二.枚举约束 从 C# 7.3 开始,还可指定 System.Enum 类型作为基类约束。 CLR 始终允许此约束,但 C# 语言不允许。 使用 System.Enum 的泛型提供类型安全的编程,缓存使用 System.Enum 中静态方法的结果。 以下示例查找枚举类型 的所有有效的值,然后生成将这些值映射到其字符串表示形式的字典。
public static Dictionary<int, string> EnumNamedValues<T>() where T : System.Enum { var result = new Dictionary<int, string>(); var values = Enum.GetValues(typeof(T)); foreach (int item in values) result.Add(item, Enum.GetName(typeof(T), item)); return result; }Enum.GetValues 和 Enum.GetName 使用反射,这会对性能产生影响。 可调用 EnumNamedValues 来生成可缓存和重 用的集合,而不是重复执行需要反射才能实施的调用。 如以下示例所示,可使用它来创建枚举并生成其值和名称的字典:
enum Rainbow { Red, Orange, Yellow, Green, Blue, Indigo, Violet } var map = EnumNamedValues<Rainbow>(); foreach (var pair in map) Console.WriteLine($"{pair.Key}:\t{pair.Value}");枚举类型 是由基础整型数值类型的一组命名常量定义的值类型。 若要定义枚举类型,请使用 enum 关键字并指 定枚举成员 的名称:
enum Season { Spring, Summer, Autumn, Winter }默认情况下,枚举成员的关联常数值为类型 int ;它们从零开始,并按定义文本顺序递增 1。 可以显式指定任何 其他整数数值类型作为枚举类型的基础类型。 还可以显式指定关联的常数值,如下面的示例所示:
enum ErrorCode : ushort { None = 0, Unknown = 1, ConnectionLost = 100, OutlierReading = 200 }不能在枚举类型的定义内定义方法。 若要向枚举类型添加功能,请创建扩展方法。 枚举类型 E 的默认值是由表达式 (E)0 生成的值,即使零没有相应的枚举成员也是如此。 可以使用枚举类型,通过一组互斥值或选项组合来表示选项。 若要表示选项组合,请将枚举类型定义为位标志。 三.转换 对于任何枚举类型,枚举类型与其基础整型类型之间存在显式转换。 如果将枚举值转换为其基础类型,则结果为 枚举成员的关联整数值。
public enum Season { Spring, Summer, Autumn, Winter } public class EnumConversionExample { public static void Main() { Season a = Season.Autumn; Console.WriteLine($"Integral value of {a} is {(int)a}"); // output: Integral value of Autumn is 2 var b = (Season)1; Console.WriteLine(b); // output: Summer var c = (Season)4; Console.WriteLine(c); // output: 4 } }使用 Enum.IsDefined 方法来确定枚举类型是否包含具有特定关联值的枚举成员。 对于任何枚举类型,都存在分别与 System.Enum 类型的装箱和取消装箱相互转换。 四.枚举值和操作 每个枚举类型都定义了一个不同的类型;显式 枚举转换 () 需要在枚举类型和整型之间进行转换,或在两个枚举类 型之间进行转换。 枚举类型可以采用的值集不受其枚举成员限制。 特别是,枚举的基础类型的任何值都可以转 换为枚举类型,并且是该枚举类型的非重复有效值。 枚举成员具有其包含枚举类型的类型 (除了其他枚举成员初始值设定项中:请参阅 枚举成员) 。 使用关联值在枚 举类型中声明的枚举成员的值 E v 为 (E)v 。 可以在枚举类型的值上使用以下运算符: == 、 != 、、 < 、 > <= 、 >= (枚举比较运算符) 、binary + (加 法运算符) 、二进制 - (减法运算符) 、、 ( ^ & | 枚举逻辑运算符) 、 ( ~ 按位求补运算符) 以及 ++ ( -- 后缀增量和减量运算符以及前缀增量和减量运算符) 。 每个枚举类型都自动派生自类 System.Enum (后者反过来派生自 System.ValueType 和 object ) 。 因此,此类的继 承方法和属性可用于枚举类型的值。 五.枚举逻辑举运算符 每个枚举类型都 E 隐式提供以下预定义的逻辑运算符:
E operator &(E x, E y); E operator |(E x, E y); E operator ^(E x, E y);计算结果 x op y (其中 x 和 y 是具有基础类型的枚举类型的表达式 E U ), op 是一个逻辑运算符,与计 算完全相同 (E)((U)x op (U)y) 。 换言之,枚举类型逻辑运算符只对两个操作数的基础类型执行逻辑运算。
这篇关于枚举的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略