好吧,这里开始......潜在的downVote素材,但枚举是我最喜欢的东西之一......
看法
专注于最适合您的设计和代码的内容。不使用枚举是因为数据库没有那种“数据类型”?好的。那么我们不要出于同样的原因制作任何自定义类。那是胡说八道。
枚举善良
(注意:我用 C# 编写代码)
- 允许您根据问题域声明事物。字符串是字符串,但 MonsterType 枚举是 Monster(类型)。
- enum 本质上是强类型的。使用未定义的枚举值是编译错误。OTOH,字符串拼写错误是另一个调试会话。
- 我特别喜欢它的
switch
陈述。击败 theHellOutta 整数:switch(MonsterType)
- 枚举可以详尽地定义所有有效值
- 倾向于文档化
- 代码质量增强器 - 确保您必须重新编译才能添加新成员,但这是深思熟虑的,并且缺少相关的代码更改会爆炸(一件好事)相对于未在某处处理的新字符串值,表现为难以捉摸逻辑/处理错误,需要您进行调试会话。
- 默认为零,不为空。有趣的是,null 概念是如何把事情搞砸的。在它所属的数据库中保留“null”。
- 专业编码提示:始终明确定义默认成员。回复:
MonsterType.Unknown = 0
。您的奖励将是更容易编写、错误更少且更易于阅读的代码。您的维护程序员会感谢您的。
弦坏
- 默认值为空。这是一场围绕 null 和“空字符串”的持续战斗。我经常看到像这样愚蠢的、漏洞百出的代码:
if(string.IsNullorEmpty(myString.Trim()) ...
- 如果 myString 为空,您的程序会因运行时异常而崩溃。枚举不能发生。
- 字符串比较区分大小写
- 容易出现拼写错误
- “字符串”类型是通用的,绝不可以帮助您根据您的域表达您的问题
- 从数据库中获取的设置
myString = null
不是一个有值的变量,它甚至不是一个对象,但我们试着像对待它一样对待它!
整数混淆
if (MonsterType == 3)...
这是什么意思?纳夫说。
这是一个实践练习。在您的 IDE 中,单击“3”并要求它“查找定义”。如果你的 IDE 会说话,它会说“你为什么不定义你的问题域中的东西,而不是让我猜“3”是什么意思?
哦,我知道。我会在某处声明一堆常量……某处。我的天啊。让我们假设我们正在使用枚举!而且它比使用一组有凝聚力的类型安全值更有趣!
null 让我抓狂
C# 有一个String.Empty
静态属性是有原因的。它不会劫持有效值(例如空格)或 null 来表示实例化的字符串对象,该对象的值明确不是任何(有效)字符串。这与 null 不同。
从字面上看,null 意味着什么都没有。意思是“走开,没人在家”。例如,编码人员经常希望它表示“未知的怪物类型”,但是为了大声喊出明确定义这些概念(参见上面的 enum pro 提示)。恕我直言,像这样使用 null 意味着您的设计缺少一些东西。
null 是代码僵尸。它在四处走动,但什么都没有,死了,无论如何。如果你不小心,它会咬你!
您将体验到决定将“空”字符串存储为空格字符或 null 的无穷乐趣;
并且空格实际上是有效的字符串域值,而不是“无值”值;
并且那个 null 和“空字符串”实际上并不意味着同样的事情,当你需要它们的“自然”功能时,试图让它们产生问题;
以及从 string.empty 到 null 到空间的代码转换的不断大惊小怪,反之亦然,以适应手头的任务。随着时间的推移,您的代码将在这方面变得不一致。
现在听我说,以后相信我。