如何使用枚举[]?

时间:2013-11-06 07:12:07

标签: c# .net arrays enums

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

public bool[] Security {get; set;}

,其中

[0] = Admin
[1] = GrantWrites
[2] = GrantDeletes
[3] = User

工作得很好。 我将它设置为{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
    }

}

我找到了一些像this这样的链接但没有帮助。

提前致谢

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

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

但是现在?

2 个答案:

答案 0 :(得分:7)

尝试:

[Flags]
public enum Security
{
    Admin = 1,
    GrantWrites = 2,
    GrantDeletes = 4,
    User = 8
}

你会像这样使用它:

Security security = Security.GrantWrites | Security.GrantDeletes;

if ((security & Security.GrantWrites) == Security.GrantWrites)
{
}

p.s.w.g.指出的比较可以简化,以提高其可读性。此外,我建议在enum中包含一个默认值(对于未初始化变量的时间):

[Flags]
public enum Security
{
    None = 0,
    Admin = 1,
    GrantWrites = 2,
    GrantDeletes = 4,
    User = 8
}

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

[Flags]
public enum Security
{
    // Other values
    FullAccess = Admin | GrantWrites | GrantDeletes
}

更多关于MSDN的内容。请注意,此方法模仿文件系统(以及许多其他文件)中文件/目录的属性。使用IMO比使用other answer

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

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

  • 标志是有限的(如果您对Int32使用enum或为Int64使用64,则为32。
  • 你不能轻易切换到其他东西(例如,如果Security必须成为一个类,你需要编写更多代码来模仿枚举语法和一些使用枚举时代码所做的假设将被破坏。

答案 1 :(得分:6)

删除[]并使用enum代替Enum

public enum Security
{
    Admin,
    GrantWrites,
    GrantDeletes,
    User
}

您可能希望使用Security[]作为方法参数:

public UserCrops(etc.., Security[] _Security) 

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

阅读枚举类型为位标志部分下的Enumeration Types (C# Programming Guide)以获取更多信息。