想象一下场景。
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)
{
...
然而,这有点乏味,我不能假设另一个开发人员将了解如何正确使用枚举。
每个枚举都是必需的,因为可能存在一个实例,我们可能希望在保存的情况下执行某些特定操作,例如没有更改。
我愿意接受其他设计理念。
答案 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)
您可以通过我在问题下发布的链接示例,但使用非独占标志值来实现此目的。请注意,SavedWithChanges
和SavedWithoutChanges
都包含分配给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");
}
}