了解 C# 标志
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# 开发中非常有用的功能。

