C# 如何使用枚举[]?
在我的项目中,我使用一个bool数组来定义用户的访问权限。 比如说C# 如何使用枚举[]?,c#,.net,arrays,enums,C#,.net,Arrays,Enums,在我的项目中,我使用一个bool数组来定义用户的访问权限。 比如说 public bool[] Security {get; set;} 在哪里 它运行得很好。 我会将它设置为{F,T,F,T}或{0,1,0,1},这个特定的用户作为一个用户获得访问权,它允许他写 我试图将其转换为枚举,但显然我需要它的数组 目前我有以下情况(不工作) } 我找到了一些类似的链接,但没有帮助 提前谢谢 编辑:这两个答案都解释得很好,但我选择非标志性答案,只是因为这对我来说似乎更容易:) Edit2:如何创建新对
public bool[] Security {get; set;}
在哪里
它运行得很好。
我会将它设置为{F,T,F,T}或{0,1,0,1},这个特定的用户作为一个用户获得访问权,它允许他写
我试图将其转换为枚举,但显然我需要它的数组
目前我有以下情况(不工作)
}
我找到了一些类似的链接,但没有帮助
提前谢谢
编辑:这两个答案都解释得很好,但我选择非标志性答案,只是因为这对我来说似乎更容易:)
Edit2:如何创建新对象(类外?)
我过去常这样做
bool[] security = new bool[9];
for (int i = 0; i < 9; i++)
{
security[i] = chklstSecurity.Items[i].Selected;
}
userCropList.Add(new UserCrops(.., txtBiologicalAssessmentApprovalDate.Text, security));
bool[]安全性=新bool[9];
对于(int i=0;i<9;i++)
{
安全性[i]=chklstSecurity.Items[i]。选中;
}
userCropList.Add(新的UserCrops(..,txtSessmentApprovalDate.Text,security));
但是现在?删除
[]
并使用enum
而不是enum
:
public enum Security
{
Admin,
GrantWrites,
GrantDeletes,
User
}
您可能希望使用Security[]
作为方法参数:
public UserCrops(etc.., Security[] _Security)
使用flags(as)也是一个很好的建议,但它需要您重新考虑如何存储权限。与存储bool
数组不同,您将把整个安全集表示为一个值,用不同的位表示每个权限
有关详细信息,请阅读“枚举类型作为位标志”一节 试试:
[Flags]
public enum Security
{
Admin = 1,
GrantWrites = 2,
GrantDeletes = 4,
User = 8
}
您可以这样使用它:
Security security = Security.GrantWrites | Security.GrantDeletes;
if ((security & Security.GrantWrites) == Security.GrantWrites)
{
}
如所指出的,可以简化比较,以提高其可读性。此外,我建议在枚举
中包含一个默认值(用于变量未初始化时):
最后请注意,您可以为常用标志组合提供快捷方式:
[Flags]
public enum Security
{
// Other values
FullAccess = Admin | GrantWrites | GrantDeletes
}
更多关于这个。请注意,这种方法模拟了文件系统(以及许多其他系统)中文件/目录的属性。IMO的使用比保留枚举数组要简单得多,如下所示:
- 您不必搜索整个数组来检查是否授予了权限
- 您不必检查
值(null
不能为enum
,数组可以为空)null
- 它使用更少的空间(即使现在这并不那么重要)
- 它自然(更)安全,因此需要更少的检查(例如,避免阵列内的重复)
- 它可以很容易地存储(作为文本或整数,无需额外代码)
- 标志是有限的(如果对
使用enum
,则为32;对Int32
使用64)Int64
- 您无法轻松切换到其他类(例如,如果
必须成为一个类,则需要编写更多的代码来模拟枚举语法,并且代码在使用枚举时所做的一些假设将被打破)安全性
new[]{Security.GrantWrites,Security.GrantDeletes}
是的,我明白了。我只是觉得使用枚举数组很奇怪,因为我可能会在其中使用标志(比如32 bool数组来表示Int32 LOL)。@Adriano是的,这两种方法都是有效的(取决于应用程序的具体需求)。我本想提到使用国旗,但你抢先一步+1:)注意(security&security.GrantWrites)=security.GrantWrites
可以简化为security.hasvag(security.GrantWrites)
。它也更容易阅读。
Security security = Security.GrantWrites | Security.GrantDeletes;
if ((security & Security.GrantWrites) == Security.GrantWrites)
{
}
[Flags]
public enum Security
{
None = 0,
Admin = 1,
GrantWrites = 2,
GrantDeletes = 4,
User = 8
}
[Flags]
public enum Security
{
// Other values
FullAccess = Admin | GrantWrites | GrantDeletes
}