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

时间:2015-10-15 11:26:11

标签: c# .net enums

想象一下场景。

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 SavedWithChanges,则可以将其视为SavedWithoutChanges

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

SaveStates lastState = SaveStates.SavedWithoutChanges;

我最好喜欢做这样的事情:

if (lastState == SaveStates.Saved)
{
    //The state is saved, do something awesome.
}

我当然可以这样做:

if (lastState == SaveStates.SavedWithChanges || lastState == SaveStates.SavedWithoutChanges)
{
    ...

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

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

我愿意接受其他设计理念。

6 个答案:

答案 0 :(得分:5)

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

public static class SaveStatesExtension
{
    public static bool IsSavedState(this SaveStates state) {
        return state == SaveStates.SavedWithChanges || 
               state == SaveStates.SavedWithoutChanges;
    }
}

然后您的使用示例变为:

if (lastState.IsSavedState())
{
    //The state is saved, do something awesome.
}

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

答案 1 :(得分:3)

您可以通过我在问题下发布的链接示例,但使用非独占标志值来实现此目的。请注意,SavedWithChangesSavedWithoutChanges都包含分配给1的位Saved

[Flags]
public enum SaveStates
{
    Saved = 1,
    SavedWithChanges = 3,
    SavedWithoutChanges = 5
}

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

}

但是,这对其他开发人员来说可能相当不直观 - 通常不会以这种方式使用标记枚举。因此,明确说明具有所有枚举值的所有条件可能更具可读性。非常好主意posted by Konamiman

public static bool IsSaved(SaveStates state)
{
    return state == SaveStates.SavedWithChanges
        || state == SaveStates.SavedWithoutChanges;
}

结合了两个世界中最好的一个:principle of least astonishment满足,同时简洁易读。

答案 2 :(得分:3)

如果您要使用Flags枚举,请将其自行记录

[Flags]
public enum SaveStates
{
    Saved = 1,
    WithChanges = 2,
    SavedWithoutChanges = Saved, // a bit pointless! Its the same as Saved
    SavedWithChanges = Saved | WithChanges  // has value "3"
}

然后,根据其他答案

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

}

答案 3 :(得分:1)

如何更改枚举?

public enum SaveStates
{
    NotSaved,               //Represents "not saved" state
    SavedWithChanges,    //Represents a successful save, where records were modified
    SavedWithoutChanges  //Represents a successful save, but no records were modified
}

在这种情况下,您可以将否定用于您所说的目的:

if (lastState != SaveStates.NotSaved)
{
    //The state is saved, do something awesome.
}

此外,它还为您提供了一个枚举值,可以将其用作“默认”值,这被认为是一个很好的“干净代码”练习。

答案 4 :(得分:0)

我更喜欢这个:

SaveStates[] savedWithOrWithoutChanges = { SaveStates.SavedWithChanges, SaveStates.SavedWithoutChanges };
if (savedWithOrWithoutChanges.Contains(lastStat))
{
    ...
}

这非常直观,每个开发人员都会理解它。

答案 5 :(得分:0)

为了不仅仅使用两个bool值而不是一个枚举代表两个事物。一个用于指示是否已保存,另一个用于指示是否为"有更改"。如果第一个是假的,你就忽略第二个。

private bool saved;

private bool withChanges;

public void SomeMethod()
{
    if (saved)
    {
        Console.WriteLine("Saved");

        if (withChanges)
        {
            Console.WriteLine("With Changes");
        }
        else
        {
            Console.WriteLine("Without Changes");
        }
    }
    else
    {
        Console.WriteLine("Not saved");
    }
}