如何使用枚举[]?

Ang*_*ore 0 .net c# arrays enums

在我的项目中,我使用的是一个bool数组,它定义了用户的访问权限.例如

public bool[] Security {get; set;}
Run Code Online (Sandbox Code Playgroud)

哪里

[0] = Admin
[1] = GrantWrites
[2] = GrantDeletes
[3] = User
Run Code Online (Sandbox Code Playgroud)

它工作得很好.我会将它设置为{F,T,F,T}或{0,1,0,1},并且该特定用户可以作为用户进行访问,并允许他编写.

我试图将它转换为枚举,但显然我需要一个数组.

目前我有以下(不工作)

public class UserCrops
{
    public UserCrops(etc.., Enum[] _Security)
    {
    .
    .
    .
        Security = _Security;
    }
    .
    .
    .
    public Enum[] Security
    {
        Admin,
        GrantWrites,
        GrantDeletes,
        User
    }
Run Code Online (Sandbox Code Playgroud)

}

我发现像一些链接这个,但没有帮助.

提前致谢

编辑:这两个答案都得到了很好的解释,但我会选择非Flag一个,因为它对我来说似乎更容易:)

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));
Run Code Online (Sandbox Code Playgroud)

但现在?

Adr*_*tti 7

试试:

[Flags]
public enum Security
{
    Admin = 1,
    GrantWrites = 2,
    GrantDeletes = 4,
    User = 8
}
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它:

Security security = Security.GrantWrites | Security.GrantDeletes;

if ((security & Security.GrantWrites) == Security.GrantWrites)
{
}
Run Code Online (Sandbox Code Playgroud)

pswg所指出的,可以简化比较以增加其可读性.此外,我建议在enum(对于未初始化变量时)中包含一个默认值:

[Flags]
public enum Security
{
    None = 0,
    Admin = 1,
    GrantWrites = 2,
    GrantDeletes = 4,
    User = 8
}
Run Code Online (Sandbox Code Playgroud)

最后请注意,您可以为常用的标志组合提供快捷方式:

[Flags]
public enum Security
{
    // Other values
    FullAccess = Admin | GrantWrites | GrantDeletes
}
Run Code Online (Sandbox Code Playgroud)

更多关于MSDN的内容.请注意,此方法模仿文件系统(以及许多其他文件)中文件/目录的属性.使用IMO比使用其他答案中建议的一系列枚举更简单:

  • 您不必搜索整个数组来检查是否授予了权限.
  • 您不必检查null值(enum不能null,数组可以).
  • 它占用的空间更少(即使现在这不是那么重要).
  • 它自然(更)安全,因此需要更少的检查(例如,以避免在数组内部重复).
  • 它可以很容易地存储(没有附加代码的文本或整数).

但与此相比,它有两个主要缺点:

  • 标志(如果您使用的是32是有限的Int32enum或64的Int64).
  • 您无法轻松切换到其他内容(例如,如果Security必须成为一个类,您需要编写更多代码来模仿枚举语法,并且在使用枚举时代码所做的某些假设将被破坏).

  • 注意`(security&Security.GrantWrites)== Security.GrantWrites`可以简化为`security.HasFlag(Security.GrantWrites)`.它也更容易阅读. (3认同)

p.s*_*w.g 6

删除[]并使用enum而不是Enum:

public enum Security
{
    Admin,
    GrantWrites,
    GrantDeletes,
    User
}
Run Code Online (Sandbox Code Playgroud)

你可能想Security[]用作方法参数:

public UserCrops(etc.., Security[] _Security) 
Run Code Online (Sandbox Code Playgroud)

使用标记(如Adriano建议的那样)也是一个很好的建议,但它需要您重新考虑如何存储您的权限.您不是存储数组bool,而是将整个安全集表示为单个值,不同的位表示每个权限.

阅读枚举类型(C#编程指南)下的部分枚举类型作为位标志以获取更多信息.