苏飞论坛

标题: [C#基语法]之C#枚举类型深入浅出 [打印本页]

作者: 站长苏飞    时间: 2013-5-27 09:49
标题: [C#基语法]之C#枚举类型深入浅出
                         [C#基语法]之C#枚举类型深入浅出
系列文章导航

  [C#基语法]苏飞传奇版   http://www.sufeinet.com/thread-3091-1-1.html

先来看看给它下的定义和规则

1.C#枚举类型是一种值类型,它用于声明一组命名的常数
2.枚举的成员是该枚举类型的命名常数。任意两个枚举成员不能具有相同的名称。每个枚举成员均具有相关联的常数值。此值的类型就是枚举的基础类型。每个枚举成员的常数值必须在该枚举的基础类型的范围之内。
3.枚举类型能选择的基础类型有:byte,sbyte,shout,ushout,int,uint,long,ulong ,默认的为int
语法

     
[C#] 纯文本查看 复制代码
   访问修辞符 enum 枚举名:基础类型
    {
        枚举成员
    }

      我们以颜色类型为例子来设置一个枚举
比如有Red,Blue,Orange三种颜色
1.直接显式设置类型
[C#] 纯文本查看 复制代码
 /// <summary>
    /// 颜色枚举
    /// </summary>
    public enum SkinType : int
    {
        /// <summary>
        /// Red
        /// </summary>
        Red = 1,
        /// <summary>
        /// Blue
        /// </summary>
        Blue = 2,
        /// <summary>
        /// Orange
        /// </summary>
        Orange = 3
    }

这样是显式设置了枚举的基础类型
当然默认的也是int类型。
2.以默认值方式设置枚举类型的值
[C#] 纯文本查看 复制代码
  /// <summary>
    /// 颜色枚举
    /// </summary>
    public enum SkinType : int
    {
        /// <summary>
        /// Red
        /// </summary>
        Red,
        /// <summary>
        /// Blue
        /// </summary>
        Blue,
        /// <summary>
        /// Orange
        /// </summary>
        Orange
    }

在枚举类型中声明的第一个枚举成员它的默值为零。
        以后的枚举成员值是将前一个枚举成员(按照文本顺序)的值加 1 得到的。这样增加后的值必须在该基础类型可表示的值的范围内;否则,会出现编译时错误。
Red=0
Blue=1
Orange=2
这样是不是也很方便
用法

使用方法其实也很简单,就像使用属性一样
[C#] 纯文本查看 复制代码
 string colorName = "";
            //获取颜色的名称
            switch (SkinType)
            {
                case SkinType.Red:
                    colorName = "Red";
                    break;
                case SkinType.Blue:
                    colorName = "Blue";
                    break;
                case SkinType.Orange:
                    colorName = "Orange";
                    break;
                default:
                    colorName = "";
                    break;
            }

获取值
[C#] 纯文本查看 复制代码
 int SkinValue = 0;
            //获取颜色的值
            switch (SkinType)
            {
                case SkinType.Red:
                    SkinValue = Convert.ToInt32(SkinType.Red);
                    break;
                case SkinType.Blue:
                    SkinValue = Convert.ToInt32(SkinType.Blue);
                    break;
                case SkinType.Orange:
                    SkinValue = Convert.ToInt32(SkinType.Orange);
                    break;
                default:
                    SkinValue = 0;
                    break;
            }

好处和为什么要使用枚举类型

1.在写代码上比较规范这是我的认知,再就是非常的方便 ,比如上面的switch 语句中,下面的每个Case可不是我写出来是自动生成的,只要你填写一个枚举类型,下面的Case是可以自动生成的,很方便
2.用字符和汉字代替数字方便识别
3.其实呢我自己使用枚举,并没有特别的意思就是感觉写起来有结构化,后期使用方法,不需要去记一个0代表什么1代表什么2代表什么的数字状态了。
而是直接看名称就知道是什么意思。
大家说说自己的看法吧。


作者: SillyPGM    时间: 2013-5-27 09:58
支持飞哥,精品越出越多,在论坛学到了很多东西。

作者: 站长苏飞    时间: 2013-5-27 10:08
SillyPGM 发表于 2013-5-27 09:58
支持飞哥,精品越出越多,在论坛学到了很多东西。

大家相互交流我也是为了提高自己

作者: gangn    时间: 2013-7-4 12:25
支持飞哥
作者: 站长苏飞    时间: 2013-7-4 12:28
gangn 发表于 2013-7-4 12:25
支持飞哥

谢谢

作者: jjloveC#    时间: 2013-7-5 17:36
好久没来了,{:soso_e113:}···顶一个,学习了
作者: 我来求学    时间: 2013-7-9 10:25
前面定义了 int SkinValue,为什么后面还要转换啊   SkinValue =Convert.ToInt32
作者: 赖同志    时间: 2013-7-26 11:56
建议飞哥在最后结束的时候附上运行结果~让新人看得更清晰!
作者: 赖同志    时间: 2013-7-26 12:01
站长苏飞 发表于 2013-5-27 10:08
大家相互交流我也是为了提高自己

希望飞哥能在最后附上运行效果图...
作者: 站长苏飞    时间: 2013-7-26 12:14
赖同志 发表于 2013-7-26 12:01
希望飞哥能在最后附上运行效果图...

截图的方法不利的Seo优化,而且不方便用户复制
但是阅读确实好
只是这里个文章大部分是不需要运行的。
以后再写的时候我尽量把文字和截图都发上来。
感谢你的建议


作者: Mr_King    时间: 2013-8-2 15:49
又学到了!谢谢飞哥
作者: toby875187    时间: 2013-8-20 11:27
支持飞哥!!
作者: 站长苏飞    时间: 2013-8-20 11:32
@Mr_King @toby875187

谢谢,以后常来转转
作者: 南方    时间: 2013-8-28 11:47
枚举还有一种用法,称为标志枚举.              [Flags]
        public enum 名称
        {
                中 = 1,
                国 = 2,
                人 = 4
        }
        

    名称 enUm = 名称.中 | 名称.国;


console.WriteLine(enUm) 就有两种值.


如果要判断直接"&"按位与



作者: cc1027cc    时间: 2013-9-6 08:35
受教了,学习中……
作者: abc    时间: 2013-11-10 18:20
好好学习,天天向上
作者: 坏小孩    时间: 2013-11-10 23:55
飞哥、、、、“ SkinValue = Convert.ToInt32(SkinType.Red);”这个在前面不是有定义了int(red、blue、orange) 了么、后面还需要有nvert。toint32()转换么??

作者: ^陪妳ソ看日落    时间: 2013-11-21 15:52
强烈支持楼主ing……
作者: lewis_fang    时间: 2013-12-13 11:53
加油,我们都看好你哦。
作者: _tawtg    时间: 2014-1-10 11:59
还有一种枚举是标志位枚举,可以提供枚举值之间的与运算。
作者: dadaboy    时间: 2014-2-18 20:45
受教了,学习中……
作者: Homeless    时间: 2014-2-23 03:27
受教了,学习中……
作者: 蓝天白云    时间: 2014-3-12 16:03
没事就看看基础,每次收获都不一样
作者: superai    时间: 2014-3-13 09:59
SillyPGM 发表于 2013-5-27 09:58
支持飞哥,精品越出越多,在论坛学到了很多东西。

OMG~~在这遇到你~~~~~这世界真小
作者: yyyyyy    时间: 2014-3-14 09:33
飞哥  谢谢了
作者: SillyPGM    时间: 2014-3-19 17:11
superai 发表于 2014-3-13 09:59
OMG~~在这遇到你~~~~~这世界真小

飞机,你个仔,忙啥呢。
作者: superai    时间: 2014-3-21 08:58
SillyPGM 发表于 2014-3-19 17:11
飞机,你个仔,忙啥呢。

上班啊~~C#學得怎麼樣了?
作者: loarder    时间: 2014-3-25 17:50
case语句如何自动生成,求教
作者: 站长苏飞    时间: 2014-3-25 17:53
loarder 发表于 2014-3-25 17:50
case语句如何自动生成,求教

自动生成?你如果是枚举的话直接按两次Tab键就行了,如果是其他类型只能手写
作者: loarder    时间: 2014-3-25 17:55
会了谢谢
作者: loarder    时间: 2014-3-25 19:10
求教,在switch语句中的判定语句已经写明了SkinType.Blue那么这个switch语句还有什么意义?
作者: 站长苏飞    时间: 2014-3-25 22:40
loarder 发表于 2014-3-25 19:10
求教,在switch语句中的判定语句已经写明了SkinType.Blue那么这个switch语句还有什么意义?

测试例,笔误哈哈
作者: 风动鸣    时间: 2014-3-30 03:03
新手前来学习
作者: lovebeyond    时间: 2014-4-1 17:25
膜拜中……
作者: hzq1984    时间: 2014-5-16 14:30
本帖最后由 hzq1984 于 2014-5-16 14:48 编辑

c#我以前不常用,最近做项目要用到,所以开始自学!
看完楼主的文章,想到应该还能更多一点点的,所以我就写出来,当再一次复习一下,
,希望论坛越办越好!
作者: hzq1984    时间: 2014-5-16 14:37
[ 本帖最后由 hzq1984 于 2014-5-16 14:38 编辑 ]\n\n如何去的枚举类型的所有值和所有名称呢?
[C#] 纯文本查看 复制代码
  static void Main(string[] args)
        {
            //取得所有名称
            foreach (var c in Enum.GetNames(typeof(Color)))
            {
                Console.WriteLine(c);
            }
            //取得所有值
            foreach (int c in Enum.GetValues(typeof(Color)))
            {
                Console.WriteLine(c);
            }
           Console.Read();
        }
        public enum Color : int
        {
            red=2,
            green=4,
            yellow=8
           //...
          }

作者: guanhongchao    时间: 2014-6-18 17:20
飞哥你好,我也是刚刚自学C#,我看到很多人都问,前面定义了 int SkinValue,为什么后面还要转换,我理解是red是字符串,不是int 类型,所以其实转换的是red字符串到int类型,不知道我理解的有没有问题。虚心请教!
作者: guanhongchao    时间: 2014-6-18 17:26
受教了,学习中……
作者: guanhongchao    时间: 2014-6-18 17:30
飞哥你好,我也是刚刚自学C#,看到很多人问到前面定义了 int SkinValue,为什么后面还要转换,我的理解是,转换时把 red 字符串转换成int,不知道我的理解是否正确,虚心请教。
作者: yuan88008    时间: 2015-10-17 08:33
讲的好啊
作者: inciting    时间: 2015-11-5 11:58
楼主加油
作者: mxlwin    时间: 2016-6-10 11:53
NO.3 C# 枚举类型深入浅出 ~学习完毕
作者: 雕兄007    时间: 2018-8-11 14:51
楼主加油,我们都看好你哦。




欢迎光临 苏飞论坛 (http://www.sufeinet.com/) Powered by Discuz! X3.4