当前位置: 首页 > news >正文

C#:枚举及位标志周边知识详解(小白入门)

文章目录

  • 枚举
    • 为什么要有枚举?
    • 枚举的性质
    • 设置默认类型和显式设置成员的值
  • 位标志(重要)
    • 位标记是什么及作用
    • 位标志周边知识
      • HasFlag判断是否有该功能
      • 枚举前面加Flags的好处
  • 关于枚举的更多知识
    • using static简化代码
    • 获取枚举成员的字面量


枚举

为什么要有枚举?

为了增加代码的可读性以及可维护性,增加了枚举这一种值类型(直接在栈上存储数据).
如在红黑树中给节点赋初始值,直接赋值0/1可读性太差.
枚举一个Color类型,RED在代表红色节点的同时又表示0,大大增加代码的可读性.

enum Color {RED,BLACK
}class Node {//...public Node(int key) {Key = key;NodeColor = Color.RED; // 默认新插入的节点是红色}
}

枚举的性质

enum TrafficLight {RED,  //值为0YELLOW,GREEN
}

1.每个成员之间以逗号分隔,
2.每个成员默认表示的值从0开始.后面的值比前面的值大1
3.每个成员的默认类型是int
4.成员的名字不能重复

namespace shh
{enum TrafficLight{GREEN,RED,YELLOW,}class Program{static void Main(string[] args){TrafficLight t1 = TrafficLight.RED;//创建变量t1,并用枚举成员RED初始化Console.WriteLine(t1);}}
}

在这里插入图片描述
默认情况下打印t1显示的是t1的字面值RED,而不是他的实际值1.
如果要得到他的实际值,用int强转就行.

设置默认类型和显式设置成员的值

修改默认类型,在枚举类型后面加冒号,然后设置新的默认类型.

    enum TrafficLight:uint{GREEN,RED,YELLOW,}

显式设置值

namespace shh
{enum TrafficLight:uint{GREEN=100,RED,YELLOW,}class Program{static void Main(string[] args){TrafficLight t1 = TrafficLight.RED;Console.WriteLine((int)t1);}}
}

先设置GREEN的值为100,因为后面的值是前面的值+1,所以RED=101.
在这里插入图片描述

位标志(重要)

位标记是什么及作用

位标记:用数据的二进制位来表示功能的开/关
我用下面的文件操作来举例
Write表示对文件进行写操作,二进制 0001
Read表示对文件进行读操作,二进制 0010.
每个值都是2的幂,然后就可以把他们组合起来形成唯一的值.
ReadWrite是Read和Write的组合

    [Flags]enum FileOperations{None=0x0,  //0x是十六进制的意思Write=0x1,Read=0x2,Execute=0x8,ReadWrite = Read|Write}

位标志在文件权限管理中非常常见,可以通过单个整数来表示多种不同的权限.

 FileOperations F1 = FileOperations.None;FileOperations F2 = FileOperations.ReadWrite;

既节省性能,又增强代码的可读性

位标志周边知识

HasFlag判断是否有该功能

    class Program{static void Main(string[] args){FileOperations F1 = FileOperations.ReadWrite;bool Test = F1.HasFlag(FileOperations.Execute);if(Test == false){Console.WriteLine("Test can not Execute");}}}

在这里插入图片描述
变量F1没有执行权限.

另外一种判断方法:

        static void Main(string[] args){FileOperations F1 = FileOperations.ReadWrite;bool Test = (F1 & FileOperations.Write)==FileOperations.Write;if(Test == true){Console.WriteLine("Test can Write");}}

计算过程:(二进制位)
F1:0011
FileOperations.Write:0001
按位与(&)之后:0001

枚举前面加Flags的好处

    class Program{static void Main(string[] args){FileOperations F1 = FileOperations.ReadWrite| FileOperations.Execute;Console.WriteLine(F1.ToString());}}

没去Flags:
在这里插入图片描述

去掉Flags:在这里插入图片描述
Tostring:与枚举的成员匹配,成功的话返回字符串名称
没有Flags,编译器直接拿11去找枚举成员里面是否有匹配的.没有找到,打印11.
Flags相当于一个信号,告诉编译器枚举成员之间是可以进行组合的,然后他就拿着11去对应两个分开的成员.

关于枚举的更多知识

using static简化代码

using System;
using System.Collections.Generic;
using static shh.TrafficLight;
namespace shh
{enum TrafficLight{GREEN=100,RED,YELLOW,}class Program{static void Main(string[] args){Console.WriteLine($"{(int)RED}");}}
}//输出:101

using static shh.TrafficLight;扩展TrafficLight这个静态类,使得在函数体内不需要用 类名.成员 来访问
简化:TrafficLight.RED ==> RED

从中我们也可以看出,枚举类型属于静态类型,所以我们不用创建变量也能使用.顺便说一下,我们的Main主函数也是静态的.

namespace shh
{enum TrafficLight{GREEN = 100,RED,YELLOW,}class Program{static void Main(string[] args){Console.WriteLine(TrafficLight.GREEN);}}}

获取枚举成员的字面量

GetNames方法:调用Enum类型的GetNames方法,传参(用typeof来获取枚举类型),最后foreach遍历取得枚举成员.

namespace shh
{enum TrafficLight{GREEN=100,RED,YELLOW,}class Program{static void Main(string[] args){foreach (var name in Enum.GetNames(typeof(TrafficLight))) Console.WriteLine(name);}}
}//输出
//GREEN
//RED
//YELLOW

http://www.lryc.cn/news/411549.html

相关文章:

  • 这本vue3编译原理开源电子书,初中级前端竟然都能看懂
  • 小白如何安装WNO(小波神经算子),需要安装python3.8,torch,ptwt,pywt等
  • Java HashMap 源码解读笔记(一)--xunznux
  • “等保测评下的数据加密与隐私保护“
  • Oat++ 后端实现跨域
  • Three basic starting points to do AI
  • 等保测评练习卷22
  • Linux用户-普通用户
  • 世界顶级思想家颜廷利:生命的升华,人类与动物的进化之道
  • 团队心脏:项目比赛中激发团队潜力的策略与技巧
  • Qt安卓开发的一些概念
  • 语音交互、AI问答,等你来体验!
  • 深度对比分析python和RPA,为什么会python了,还要用RPA?
  • el-table支持行拖动
  • git拉取项目并切换到某个tag
  • 数据结构之探索“堆”的奥秘
  • 光影漫游者:高科技球形场馆开启沉浸式体验新时代—轻空间
  • 面试题007:static修饰符可以修饰什么,static的重要规则
  • EasyTwin的动画系统已经到了next level?快来一探究竟!
  • 当业务开展遇到阻力,如何开展?
  • 萨科微半导体整流桥
  • STM32的GPIO输入输出方式设置示例
  • SQL插入、更新和删除数据
  • 如何将幻灯片中的图片背景设置为透明
  • 【雅思考试】-- Day2 - 单词
  • .\venv\Scripts\activate : 无法加载文件 E:\,因为在此系统上禁止运行脚本。
  • C++之explicit
  • 基于FPGA的以太网设计(4)----详解PHY的使用(以YT8531为例)
  • 机器学习之心一区级 | Matlab实现SMA-Transformer-LSTM多变量回归预测(黏菌算法优化)
  • idea导入项目根目录缺失解决方法