Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C语言中优化枚举赋值#_C#_Enums_Flags - Fatal编程技术网

C# 如何在C语言中优化枚举赋值#

C# 如何在C语言中优化枚举赋值#,c#,enums,flags,C#,Enums,Flags,我有这个号码 enum NetopScriptGeneratingCases { AddLogMessages, AddLogErrors, AddLogJournal, AllLog = AddLogMessages | AddLogErrors | AddLogJournal, DoNothing } 还有一个带有3个复选框的UI,所以根据选中的复选框,我必须生成可能的案例来完成一些工作 NetopScriptGeneratingCases neto

我有这个号码

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);

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

如注释中所述,编译器默认情况下会给枚举一个递增的整数值,这不适合用作位标志。尝试修改您的定义如下:

[Flags]
enum NetopScriptGeneratingCases
{
        DoNothing = 0,
        AddLogMessages = 1<<0,
        AddLogErrors = 1<<1,
        AddLogJournal = 1<<2,
        AllLog = AddLogMessages | AddLogErrors | AddLogJournal
}
[标志]
枚举NetopScriptGeneratingCases
{
DoNothing=0,
AddLogMessages=1我会选择什么,然后像这样分配变量:

NetopScriptGeneratingCases netopScriptGeneratingCases = NetopScriptGeneratingCases.DoNothing;

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

如果你想使用你的
enum
作为一组标志,就像你将它们组合在一起创建
AllLog
那样,那么你需要给它们2次幂的值。也就是说,你应该将第一个值设置为1,然后设置为2,然后设置为4,并且
DoNothing
都应该设置为0。我认为代码的编写方式是有缺陷的,因为first检查将吞并许多其他检查;您应该尝试使用最具体的检查,并让更多的一般情况结束。附录:要执行相反的操作,请检查您和该字段(例如,
if(values&Enum.AddLogMessages)
)或1的位掩码以获得所有设置。