【发布时间】:2010-10-02 18:19:49
【问题描述】:
我有以下代码(示例),我真的对这么多“if”检查感到不舒服:
public enum Flags
{
p1 = 0x01, // 0001
p2 = 0x02, // 0010
p3 = 0x04, // 0100
p4 = 0x08 // 1000
};
public static void MyMethod (Flags flag)
{
if ((flag & Flags.p1) == Flags.p1)
DoSomething();
if ((flag & Flags.p2) == Flags.p2)
DosomethingElse();
if ((flag & Flags.p3) == Flags.p3)
DosomethingElseAgain();
if ((flag & Flags.p4) == Flags.p4)
DosomethingElseAgainAndAgain();
}
MyMethod(Flags.p1 | Flags.p3);
有什么方法可以让我使用“switch”语句。也许如果我将它们转换为字符串,或者使用数组?
【问题讨论】:
-
switch语句不是你想要的,因为它相当于一大堆if ... else if ... else if ...语句,这显然不是你所拥有的。 -
请注意,在 C# 4.0 中,您可以使用
flag.HasFlag(Flags.p1)而不是flag & Flags.p1 == Flags.p1 -
我认为一系列的 if 检查很清楚,因为它准确地描述了你在做什么。通过将每个部分的逻辑分离到自己的方法中,您已经消除了会掩盖顶级模式(即一系列条件操作)的噪音。
-
Dan Bryant:在大多数情况下你是对的,但是很难看到它并知道所有的标志都被表示了,而且很难确保维护程序员不会进来并且开始尝试通过在其中插入
else来“优化”它。 -
这段代码唯一的“错误”是没有漂亮的长注释。
标签: c# enums switch-statement bit-manipulation