跳至页脚内容
Iron Academy Logo
学习 C#
学习 C#

其他类别

了解 C# 标志

Tim Corey
8分32秒

C# 标志是一个强大但经常被忽视的功能,它允许开发人员使用位操作管理权限和选项。 在他的视频"C#中的二进制:在 10 分钟内完成标记"视频中,Tim Corey 简明扼要地解释了标记的工作原理以及如何在 C# 中有效利用标记。 在本文中,我们将分解 Tim 在视频中的解释和见解,以便更好地理解 C# Flags。

什么是标记?

Tim 首先介绍了 Flags 的概念。 他解释说,标志允许我们为单个变量分配多个值,因此在管理应用程序中的权限时非常有用。 为了说明这一点,Tim 创建了一个名为 SystemPermissions 的枚举,其中包含 SQL、WebServer、Redis、Azure、GitHub 和 BuildSystem 等权限。

Tim 指出,如果没有 Flags,一个变量一次只能包含一个权限。例如,如果我们尝试将 SystemPermissions.GitHub 分配给一个用户,我们就不能同时分配 SystemPermissions.BuildSystem,除非我们使用数组,但这会变得难以管理。

没有标志的问题

此时,Tim 展示了传统枚举作业的局限性。 如果我们一次分配一个权限,那么稍后检查它们就需要遍历一个数组,这既低效又不可扩展。 正如 Tim 所描述的那样,这导致了 "丑陋 "的实现,管理多个权限变得非常麻烦。

介绍标志属性

为了解决这个问题,Tim 引入了 [Flags] 特性,使枚举可以被视为位字段。 他解释说,每个权限都是通过位移法分配一个唯一的二进制值。

Tim 不分配递增数字(0、1、2、3 等),而是使用 2 的幂来分配数值:

[Flags]
enum SystemPermissions
{
    None = 0,
    SQL = 1 << 0,       // 00000001
    WebServer = 1 << 1, // 00000010
    Redis = 1 << 2,     // 00000100
    Azure = 1 << 3,     // 00001000
    GitHub = 1 << 4,    // 00010000
    BuildSystem = 1 << 5 // 00100000
}
[Flags]
enum SystemPermissions
{
    None = 0,
    SQL = 1 << 0,       // 00000001
    WebServer = 1 << 1, // 00000010
    Redis = 1 << 2,     // 00000100
    Azure = 1 << 3,     // 00001000
    GitHub = 1 << 4,    // 00010000
    BuildSystem = 1 << 5 // 00100000
}

Tim 解释说,位移可以确保每个权限都有唯一的值,不会重叠,从而实现多个权限的有效组合。

分配和组合标记

然后,Tim 演示了如何使用位操作分配和组合权限。 他解释说,我们可以通过使用位顺时针 OR( |) 运算符:

SystemPermissions timsPermissions = SystemPermissions.SQL | SystemPermissions.Redis | SystemPermissions.GitHub;
SystemPermissions timsPermissions = SystemPermissions.SQL | SystemPermissions.Redis | SystemPermissions.GitHub;

这将 SQL、Redis 和 GitHub 权限分配给 timsPermissions,并通过位运算将它们存储在一个变量中。

使用标记检查权限

Flags 的一个主要好处是能够使用位 AND (&) 操作符检查是否设置了特定权限。 Tim 演示了如何验证用户是否拥有特定权限:

if ((timsPermissions & SystemPermissions.SQL) == SystemPermissions.SQL)
{
    Console.WriteLine("Tim has SQL access.");
}
if ((timsPermissions & SystemPermissions.SQL) == SystemPermissions.SQL)
{
    Console.WriteLine("Tim has SQL access.");
}

Tim 强调说,这种方法比在数组中循环要有效得多,因为它可以快速进行位比较。

删除权限

Tim 还介绍了如何使用位 AND 和 NOT (~) 操作符移除权限。 如果需要从 timsPermissions 撤销 SQL 权限,可以这样操作:

timsPermissions &= ~SystemPermissions.SQL;
timsPermissions &= ~SystemPermissions.SQL;

这将有效删除 SQL 权限,同时保持其他权限不变。

以二进制显示标志

为直观了解 Flags 的工作原理,Tim 建议将枚举值转换为二进制表示法。 他使用辅助方法来显示权限的二进制值:

Console.WriteLine(Convert.ToString((int)timsPermissions, 2));
Console.WriteLine(Convert.ToString((int)timsPermissions, 2));

Tim 解释说,这有助于理解枚举中各个位是如何设置和操作的。

为什么使用标记?

最后,Tim 强调了为什么 Flags 在 C# 中非常有用:

  • 它们允许在一个变量中存储多个值。
  • 它们可以实现高效的权限管理。
  • 这些工具简化了使用位操作检查和修改权限的过程。

他还指出,Flags 常用于文件权限、用户角色和应用程序设置等场景。

最后的想法

在整个视频中,Tim Corey 清晰而实用地演示了 C# Flags 的工作原理。 通过使用 [Flags] 属性和位运算,可以有效管理多个权限而无需复杂的数据结构。 如果您要处理需要多个值的权限或设置,Flags 是简化实施的绝佳工具。

要想亲身体验,请查看 Tim Corey 的 视频,他在视频中逐步解释了这些概念。起初,标记可能看起来很棘手,但一旦你理解了它们的二进制性质,它们就会成为 C# 开发中非常有用的功能。

Hero Worlddot related to 了解 C# 标志
Hero Affiliate related to 了解 C# 标志

分享您的所爱,赚取更多收入

您为使用 .NET、C#、Java、Python 或 Node.js 的开发人员创建内容吗?将您的专业知识转化为额外收入!

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我