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的位掩码以获得所有设置。