首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用枚举值表示两个枚举值

使用枚举值表示两个枚举值
EN

Stack Overflow用户
提问于 2015-10-15 11:26:11
回答 6查看 242关注 0票数 4

想象一下场景。

代码语言:javascript
复制
public enum SaveStates
{
    Saved,               //Represents a successful save.
    SavedWithChanges,    //Represents a successful save, where records were modified
    SavedWithoutChanges  //Represents a successful save, but no records were modified
}

在此场景中,如果枚举是Saved SavedWithoutChanges,则可以将其视为。

所以如果我有一个这样的变量:

代码语言:javascript
复制
SaveStates lastState = SaveStates.SavedWithoutChanges;

理想情况下,我想做这样的事情:

代码语言:javascript
复制
if (lastState == SaveStates.Saved)
{
    //The state is saved, do something awesome.
}

我当然可以这样做:

代码语言:javascript
复制
if (lastState == SaveStates.SavedWithChanges || lastState == SaveStates.SavedWithoutChanges)
{
    ...

然而,这有点乏味,我不能假设另一个开发人员会理解如何正确使用枚举。

每个枚举都是必需的,因为可能有一个实例,我们可能希望在保存的情况下执行一些特定的操作,例如,在保存过程中没有进行任何更改。

我对另类设计思想持开放态度。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-10-15 11:33:39

如果您担心的是代码的可读性,您可以使用下面这样的扩展方法:

代码语言:javascript
复制
public static class SaveStatesExtension
{
    public static bool IsSavedState(this SaveStates state) {
        return state == SaveStates.SavedWithChanges || 
               state == SaveStates.SavedWithoutChanges;
    }
}

然后,您的用法示例如下:

代码语言:javascript
复制
if (lastState.IsSavedState())
{
    //The state is saved, do something awesome.
}

当然,在这种情况下,不再需要枚举中的Saved成员。

票数 5
EN

Stack Overflow用户

发布于 2015-10-15 11:30:53

您可以这样做,下面是我在问题下面发布的链接的例子,但是使用了非排他性的标志值。请注意,SavedWithChangesSavedWithoutChanges都包含分配给Saved的位1

代码语言:javascript
复制
[Flags]
public enum SaveStates
{
    Saved = 1,
    SavedWithChanges = 3,
    SavedWithoutChanges = 5
}

if ((lastState & SaveStates.Saved) == SaveStates.Saved)
{

}

然而,对于其他开发人员来说,这可能是非常不直观的--通常不会以这种方式使用标志枚举。因此,使用所有枚举值显式地声明所有条件可能会更易读。非常好的主意科纳米曼

代码语言:javascript
复制
public static bool IsSaved(SaveStates state)
{
    return state == SaveStates.SavedWithChanges
        || state == SaveStates.SavedWithoutChanges;
}

结合了两个世界的优点:最小惊讶原则既简洁又可读性好。

票数 3
EN

Stack Overflow用户

发布于 2015-10-15 11:33:24

如果你要用一个Flags枚举来做这件事,你应该让它自我记录。

代码语言:javascript
复制
[Flags]
public enum SaveStates
{
    Saved = 1,
    WithChanges = 2,
    SavedWithoutChanges = Saved, // a bit pointless! Its the same as Saved
    SavedWithChanges = Saved | WithChanges  // has value "3"
}

然后,和其他答案一样

代码语言:javascript
复制
if ((lastState & SaveStates.Saved) == SaveStates.Saved)
{

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33147280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档