枚举的存储
❶ c#的基本语法问题,枚举类型在内存中是如何存在的
事实上并不是数组 而是利用反射
考虑如下代码:
voidMain()
{
Console.WriteLine(typeof(Charac).GetEnumName(((Charac)1)));
Console.WriteLine(typeof(Charac).GetEnumName(((Charac)2)));
Console.WriteLine(typeof(Charac).GetEnumName(((Charac)3)));
}
enumCharac{
A=1,
B=2,
}
我们用Type.GetEnumName实例方法 把枚举值映射回枚举名
可以预见到 三次输出分别是 A B null
在内存中 枚举和对应的基本类型是存在映射关系的
如果未显式声明 意味着枚举默认映射到Int32 换而言之 内存中存储的就是Int32类型
另外 一切枚举类型都隐式继承System.Enum类型 以实现其中的ToString方法
而ToString方法中会做检测:如果enum按位域声明 则会返回按位或的字符串解释
否则 内部执行Type.GetEnumName方法寻找对应的枚举值名称
如果未找到 直接输出基础类型(如int32)的值
更多的详细信息可以参考CLR via C# 或者查看Enum类的源代码-w-
❷ C++ 中的 enum 结构在内存中是怎么存储的
enum是常量,类似于#define,只不过它的成员值是编译器自动赋值,也不可更改。
不存在存储问题,它是直接在指令中以常数的形式存在。
❸ Pascal语言中的枚举类型为什么可以节省内存空间
pascal我没有学过,不过我是这样理解这句话的:
一个字节最多可以表示256种状态,应为2^8=256
上面这个例子可以这样表示:
00000000表示红,
00000001表示黄,
00000010表示蓝,
00000011表示白,
这样就只用了一个字节,却能表示四种颜色。
可以看到,其实还有00000100....等等在这个例子里没有用到。其实最多一个字节就可以表示256种状态。
而用4个整形变量就会浪费很多空间,因为一个整数占2个字节。
❹ C# 枚举为什么要用一个INT类型来存储
枚举是一种特殊的类型,你可以看作一个类里面有很多静态属性,每一个属性只有 get行为,并且直接return 了一个 值,
所以它是整数类型的,可以显式的 继承 byte short int long ,默认是 int,
❺ 在数据库中存枚举值,用数字还是字符好
这个要看你的 枚举, 是 仅仅一次只能选择一个的? 还是一次可以选择多个的.
例如你的
order_id order_status
1 SUCS(成功success)
2 PCES(处理process)
某行数据, 要么就是 SUCS(成功success) , 要么就是 PCES(处理process)
这种情况下, 用字符是比较合适的。
但是如果枚举是可以选择多个的, 例如:
id desc
1 无党派
2 知识分子
4 少数民族
8 女性
16 ......
这种情况下, 如果一个人, 多个枚举都满足的情况下, 那么这种情况下, 使用 数字 是比较适合的。
也就是
如果某个人,是 无党派汉族女性研究生, 那么枚举值 = 1+2+8
❻ Swift-细说枚举(Enum)
声明一个方向的枚举,包含四个枚举值: 东/西/南/北.
Swift 的枚举成员在被创建时本身就是完备的值,这些值的类型是已经明确定义好的 Direction 类型. 不会像 Objective-C 一样被赋予一个默认的整型值。在上面的 Direction 例子中,east、west 、north、south不会被隐式地赋值为 0,1,2 和 3。
Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为原始值),则该值的类型可以是:字符串、字符、任意的整数值或浮点类型。
Swift的枚举类型提供了一个叫原始值(RawValues)的实现,它为枚举项提供了一个默认值,这个默认值在编译期间就是确定的。
通过原值值获取的枚举项是可选类型的,所以需要用if let 做一下判断。
未指定枚举值类型
隐式原始值
隐式原始值下枚举项使用系统的分配值:
显式原始值
隐式 + 显式原始值
这里使用了属性观察者,Swift里面的枚举更像一个对象,因此可以很方便的使用属性观察者对枚举值进行监听。
在 Swift 中,还可以定义这样的枚举类型,它的每一个枚举项都有一个附加信息,来扩充这个枚举项的信息表示,这又叫做关联值。
一定要学会使用关联值,这一点很重要。具体的使用后面的第九节会细说
通常情况下枚举是很容易进行相等判断的。一旦为枚举增加了关联值,Swift就没法正确的比较了,需要自己对该枚举实现 == 运算符。
借助 Comparable 协议,来实现枚举的比较。
遵守 CaseIterable 协议的swift枚举是可以遍历的,通过allCases获取所有的枚举成员.
app里面的接口地址,如果都放一起,命名或者寻找都不方便,可以用枚举的嵌套来设计。可以分散在多个文件中,方便维护和管理。
用枚举来管理系统里面的常量是一个不错的选择。
枚举中不能使用存储属性,但是可以使用计算属性,计算属性的内容是在枚举值或者枚举关联值中得到的。
在这里,可以认为枚举是一个类,introced是一个成员方法,AppleDeivce.iPhone 就是一个AppleDeivce的实例,case们是它的属性。introced里面的switch self,其实就是遍历这个匿名属性的所有场景,如iPad,iPhone等,然后根据不同的场景返回不同的值。
可以做枚举的自定义构造方法。
系统的打印协议
让枚举遵守这个协议
枚举可以进行扩展。可以将枚举中的case与method/protocol分隔开,阅读者可以快速消化枚举的内容。
设计一个网络类下的错误信息的处理功能。
在项目中经常使用 UserDefaults 来存储一下简单的用户信息。但是对 Key 的维护不会很方便。而且会想不起来。用枚举+结构体就能很好的解决这个问题。
这么设计APP的存储模块,是不是更有层级感,更加方便使用呢?
递归枚举是拥有另一个枚举作为枚举成员关联值的枚举。当编译器操作递归枚举时必须插入间接寻址层。可以在声明枚举成员之前使用 indirect关键字来明确它是递归的。 也可以声明在整个枚举前,让所有的枚举成员都是递归的。
