我注意到我在同一个项目中一直在做这个不一致的事情。在某些地方,我会有一个带有ALL选项的枚举,而在其他地方,我会将我的枚举作为可空类型,其中空值表示所有(或没有过滤器)。
当我不得不写if (Region != null && Region != Regions.ALL)
之类的东西时,我注意到了它。
有没有理由去某种方式?
答案 0 :(得分:7)
就传达意义而言,使用Regions.All
更明确。您可以将该含义“分配”给null
,计算机就可以了。但是,程序的读者需要根据您使用null
枚举值的方式或阅读您的评论来解除其含义。另一方面,Regions.All
是自我记录和不言自明的。
答案 1 :(得分:2)
如果您需要指定“全部”或“空”类型的枚举,我通常会使用Flag
属性并使用按位&
和|
。这是一个更灵活的解决方案。
至于制作可空类型或有一个选项是“全部”,我认为如果它对你有意义,那么我认为没有问题。我只是喜欢使用Flags。
答案 2 :(得分:2)
通常,我们使用null
表示“未指定”或“不存在”或“不适用”。因此,在过滤器的情况下,允许null是有意义的,因为它意味着“无过滤”。
此外,名为Regions
的枚举可能包含Northeast
,Southeast
,Midwest
,Southwest
和West
等值。现在,如果我错了,请纠正我,但我不认为在美国有任何名为“全部”的地区。在我长达几年的逗留期间,我听到电视上的气象员谈到了西方的天气,以及东南部的天气等等,但在一些名为“全部”的地方从来没有天气。所以,我倾向于认为没有这样的地区。因此,在一个区域的枚举中包括“全部”是一个黑客。突然间,Regions
枚举与地区无关;相反,它是关于区域和/或过滤的。在编程中要注意这种意义上的变化,并且通常要避免。