(精华)2020年7月22日 C#基础知识点 Flags特性
发布日期:2021-06-29 15:08:15 浏览次数:3 分类:技术文章

本文共 3491 字,大约阅读时间需要 11 分钟。

public enum Equipment{
刀, 枪, 箭, 弓}public sealed class Player{
internal Equipment equipmentState;//用于描述角色可以使用哪些武器 //......其它成员}
namespace UsageOfFlagsAttribute{
[Flags] public enum Equipment {
NONE = 0x0000, 刀 = 0x0001, 枪 = 0x0002, 箭 = 0x0004, 弓 = 0x0008 } public sealed class Player {
internal Equipment equipmentState;//用于描述角色可以使用哪些武器 } class Program {
static void Main(string[] args) {
Player player = new Player(); player.equipmentState = Equipment.刀 | Equipment.弓; //可以表示成多种状态的集合 } }}

用Flags标记后也就可以按位计算了,一般枚举有3种按位计算。

按位或(“|”):将指定的符号加入到枚举实例中

按位与(”&“):判断枚举实例中是否有指定的符号

异或(”^“):删除枚举实例中指定的符号

class Program    {
static void Main(string[] args) {
Player player = new Player(); //按位或 player.equipmentState = Equipment.刀; player.equipmentState = player.equipmentState | Equipment.弓; Console.WriteLine(player.equipmentState.ToString());//打印结果:刀,弓 //按位与 player.equipmentState = Equipment.刀 | Equipment.弓; player.equipmentState = player.equipmentState & Equipment.刀; Console.WriteLine(player.equipmentState.ToString()); //打印结果 : 刀 //异或 player.equipmentState = Equipment.刀 | Equipment.弓; player.equipmentState = player.equipmentState ^ Equipment.弓; Console.WriteLine(player.equipmentState.ToString()); //打印结果 : 刀 Console.ReadKey(); } }

但是每次都要写 player.equipmentState = player.equipmentState ^ Equipment.弓; 这么赋值代码的可读性不好,而且容易浪费时间。因此可以扩展方法来封装这些操作。

public static class EnumExtendMethods    {
/// /// 判断位标致的枚举实例中是否有指定符号 /// /// 实例 /// 指定的符号 ///
public static bool Contains(this Equipment equipment,Equipment checkState) {
if (checkState == 0) {
throw new ArgumentOutOfRangeException("checkState", "不能为NONE"); } return (equipment & checkState) == checkState; } /// /// 将指定的符号从枚举实例中移除 /// /// /// 指定要移除的符号 ///
public static Equipment Remove(this Equipment equipment, Equipment removeState) {
return equipment ^ removeState; } /// /// 向枚举实例中加入指定的符号 /// /// /// ///
public static Equipment Append(this Equipment equipment, Equipment addState) {
return equipment | addState; } }

现在可以这样调用了

class Program    {
static void Main(string[] args) {
Player player = new Player(); //按位或 player.equipmentState = Equipment.刀; player.equipmentState = player.equipmentState.Append(Equipment.弓); Console.WriteLine(player.equipmentState.ToString());//打印结果:刀,弓 //按位与 player.equipmentState = Equipment.刀 | Equipment.弓; if (player.equipmentState.Contains(Equipment.刀)) {
Console.WriteLine(player.equipmentState.ToString()); //打印结果 : 刀,弓 } //异或 player.equipmentState = Equipment.刀 | Equipment.弓; player.equipmentState = player.equipmentState.Remove(Equipment.弓); Console.WriteLine(player.equipmentState.ToString()); //打印结果 : 刀 Console.ReadKey(); } }

转载地址:https://codeboy.blog.csdn.net/article/details/107511881 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:(精华)2020年7月22日 ASP.NET Core Worker Service构建系统服务实现任务调度
下一篇:(精华)2020年7月22日 ASP.NET Core Swagger的使用(NSwag工具版)

发表评论

最新留言

不错!
[***.144.177.141]2024年04月27日 02时16分02秒