C# 如何使用枚举[]?

C# 如何使用枚举[]?,c#,.net,arrays,enums,C#,.net,Arrays,Enums,在我的项目中,我使用一个bool数组来定义用户的访问权限。 比如说 public bool[] Security {get; set;} 在哪里 它运行得很好。 我会将它设置为{F,T,F,T}或{0,1,0,1},这个特定的用户作为一个用户获得访问权,它允许他写 我试图将其转换为枚举,但显然我需要它的数组 目前我有以下情况(不工作) } 我找到了一些类似的链接,但没有帮助 提前谢谢 编辑:这两个答案都解释得很好,但我选择非标志性答案,只是因为这对我来说似乎更容易:) Edit2:如何创建新对

在我的项目中,我使用一个bool数组来定义用户的访问权限。 比如说

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
    使用
    Int32
    ,则为32;对
    Int64
    使用64)
  • 您无法轻松切换到其他类(例如,如果
    安全性
    必须成为一个类,则需要编写更多的代码来模拟枚举语法,并且代码在使用枚举时所做的一些假设将被打破)

以这种方式,他无法同时设置GrantRotes和GramtDeòetes。@Adriano确信他可以使用数组,
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
}