C#学习教程:应该“或”使用.Net4Hasflags:enum.HasFlag(AccessRights.Read|AccessRights.Write)我正在尝试新的HasFlags函数,想知道以下函数是否有效:enum.HasFlag(AccessRights.Read|AccessRights.Write)...因为它似乎没有...DBAccessRightsrights=(DBAccessRights)permission。权限标志;if(rights.HasFlag(DBAccessRights.WikiMode)){//有效}if(rights.HasFlag(DBAccessRights.WikiMode|DBAccessRights.CreateNew)){//无效}DBAccessRightsflags=DBAccessRights.WikiMode|DBAccessRights.CreateNew;if(rights.HasFlag(flags)){//不起作用}根据文档,如果值具有这两个标志,我想返回true。如果你想让它测试你的值是否有这些标志,你需要value.HasFlag(AccessRights.Read)|value.HasFlag(AccessRights.Write)如果这对您来说还不够好,您可能想看看我的UnconstrainedMelody项目。它恰好已经具有您想要的功能(作为Flags.cs扩展方法)://与value.HasFlag(AccessRights.Read|AccessRights.Write)相同value.HasAll(AccessRights.Read|AccessRights.Write)//相同作为value.HasFlag(AccessRights.Read)|value.HasFlag(AccessRights.Write)value.HasAny(AccessRights.Read|AccessRights.Write)这些会让事情变得更清楚,IMO。它们还避免装箱并且类型安全:)来自MSDN:HasFlag方法返回以下布尔表达式的结果。thisInstanceandflag=flag对于像AccessRights.Read|这样的复杂标志AccessRights.Write访问权限.读|AccessRights.Write,这会检查是否存在所有“包含”标志。您可能想要检查任何标志,在这种情况下您可以这样做:myAccessRights&(AccessRights.Read|AccessRights.Write)!=0|运算符是按位或。这意味着如果Read为1且Write为2,则值Read|WriteRead|Write为3(参见其二进制表示)。因此,只有当您的枚举变量同时具有Read和WriteHasFlag时,才会返回true。或者,您可以颠倒表达式的顺序://returnstrue-看起来更容易一些(AccessRights.Read|AccessRights.Write).HasFlag(myAccessRights)如果您有Read|返回true写权限。这在功能上等同于://alsoreturnstrue-asper@Ani'sanswermyAccessRights&(AccessRights.Read|AccessRights.Write)!=0EDIT正如评论中指出的那样,如果myAccessRights为空,则第一个表达式公式将返回真;如果myAccessRights不仅仅是读和写,它将返回false。以上就是C#学习教程:你应该“或”使用.Net4Hasflags:enum.HasFlag(AccessRights.Read|AccessRights.Write)分享所有内容,如果对你有用还需要进一步了解C#学习教程,希望大家多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
