【问题标题】:How to optimize enum assignment in C#如何在 C# 中优化枚举分配
【发布时间】:2016-03-09 12:24:13
【问题描述】:

我有这个枚举

enum NetopScriptGeneratingCases
{
    AddLogMessages,
    AddLogErrors,
    AddLogJournal,
    AllLog = AddLogMessages | AddLogErrors | AddLogJournal,
    DoNothing
}

还有带有 3 个复选框的 UI,所以根据选中的复选框,我必须生成可能的案例来完成某些工作。

NetopScriptGeneratingCases netopScriptGeneratingCases = NetopScriptGeneratingCases.DoNothing;

if (checkBoxAddAuditLog.Checked)
{
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogJournal;
}
else if (checkBoxAddErrorLog.Checked)
{
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogErrors;
}
else if (checkBoxAddLogMessages.Checked)
{
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogMessages;
}
else if (checkBoxAddAuditLog.Checked || checkBoxAddErrorLog.Checked)
{
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogJournal | NetopScriptGeneratingCases.AddLogErrors;
}
else if (checkBoxAddAuditLog.Checked || checkBoxAddLogMessages.Checked)
{
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogJournal | NetopScriptGeneratingCases.AddLogMessages;
}
else if (checkBoxAddErrorLog.Checked || checkBoxAddLogMessages.Checked)
{
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogErrors | NetopScriptGeneratingCases.AddLogMessages;
}
else if (checkBoxAddErrorLog.Checked || checkBoxAddLogMessages.Checked || checkBoxAddAuditLog.Checked)
{
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogErrors | NetopScriptGeneratingCases.AddLogMessages | NetopScriptGeneratingCases.AddLogJournal;
}


var modifiedFiles = NetopScriptGenerator.GenerateNetopScript(netopScriptGeneratingCases, netopFiles);

但我不确定这段代码是否正确......还有其他方法吗?

【问题讨论】:

  • 如果您要使用 enum 作为一组标志,就像通过将它们组合在一起创建 AllLog 一样,那么您需要为它们提供 2 的幂的值.就是你应该把第一个设置为1,然后是2,然后是4,DoNothing应该设置为0。
  • 我认为代码的编写方式是有缺陷的,因为第一次检查会吞噬很多其他检查;您应该尝试最具体的情况,并让更一般的情况结束。

标签: c# enums flags


【解决方案1】:

正如评论中提到的,编译器默认会给枚举一个递增的整数值,这不适合用作位标志。尝试如下修改您的定义:

[Flags]
enum NetopScriptGeneratingCases
{
        DoNothing = 0,
        AddLogMessages = 1<<0,
        AddLogErrors = 1<<1,
        AddLogJournal = 1<<2,
        AllLog = AddLogMessages | AddLogErrors | AddLogJournal
}

【讨论】:

  • 附录:做相反的事情,所以检查哪些设置,你和反对该字段(例如if ( values &amp; Enum.AddLogMessages ))或1的位掩码来获取它们。
【解决方案2】:

我会采用 Chris suggest in his answer 并像这样分配您的变量:

NetopScriptGeneratingCases netopScriptGeneratingCases = NetopScriptGeneratingCases.DoNothing;

if (checkBoxAddAuditLog.Checked)
{
    netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogJournal;
}
if (checkBoxAddErrorLog.Checked)
{
    netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogErrors;
}
if (checkBoxAddLogMessages.Checked)
{
    netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogMessages;
}

【讨论】:

    猜你喜欢
    • 2014-09-20
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2019-02-01
    相关资源
    最近更新 更多