Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

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.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
End EnumTim 解释说,位移可以确保每个权限都有唯一的值,不会重叠,从而实现多个权限的有效组合。
然后,Tim 演示了如何使用位操作分配和组合权限。 他解释说,我们可以通过使用位顺时针 OR( |) 运算符:
SystemPermissions timsPermissions = SystemPermissions.SQL | SystemPermissions.Redis | SystemPermissions.GitHub;Dim timsPermissions As SystemPermissions = SystemPermissions.SQL Or SystemPermissions.Redis Or SystemPermissions.GitHub这将SQL、Redis和GitHub权限分配给timsPermissions,使用位操作将它们存储在一个变量中。
Flags 的一个主要好处是能够使用按位与(&)运算符检查是否设置了特定权限。 Tim 演示了如何验证用户是否拥有特定权限:
if ((timsPermissions & SystemPermissions.SQL) == SystemPermissions.SQL)
{
Console.WriteLine("Tim has SQL access.");
}If (timsPermissions And SystemPermissions.SQL) = SystemPermissions.SQL Then
Console.WriteLine("Tim has SQL access.")
End IfTim 强调说,这种方法比在数组中循环要有效得多,因为它可以快速进行位比较。
Tim 还介绍了如何使用按位与和非(~)运算符来移除权限。 如果我们需要从timsPermissions撤销SQL权限,可以这样操作:
timsPermissions &= ~SystemPermissions.SQL;timsPermissions = timsPermissions And Not SystemPermissions.SQL这将有效删除 SQL 权限,同时保持其他权限不变。
为直观了解 Flags 的工作原理,Tim 建议将枚举值转换为二进制表示法。 他使用辅助方法来显示权限的二进制值:
Console.WriteLine(Convert.ToString((int)timsPermissions, 2));Console.WriteLine(Convert.ToString(CInt(timsPermissions), 2))Tim 解释说,这有助于理解枚举中各个位是如何设置和操作的。
最后,Tim 强调了为什么 Flags 在 C# 中非常有用:
他还指出,Flags 常用于文件权限、用户角色和应用程序设置等场景。
在整个视频中,Tim Corey 清晰而实用地演示了 C# Flags 的工作原理。 通过使用[Flags]属性和位运算,我们可以高效地管理多个权限,而不需要复杂的数据结构。 如果您要处理需要多个值的权限或设置,Flags 是简化实施的绝佳工具。
要想亲身体验,请查看 Tim Corey 的 视频,他在视频中逐步解释了这些概念。起初,标记可能看起来很棘手,但一旦你理解了它们的二进制性质,它们就会成为 C# 开发中非常有用的功能。
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy