C#基础枚举类型

扫地机的CPU只要二十多块?2024第二拆来了 昨天还说到这个机器人的故障,经小鱼拆机后测试和后台网友留言确认,不是防跌落问题,是轮子故障,这个轮子不会动,轮子上有一个限位开关检测机器人是否离开地面的,测试的时候也没有误触发,所以电机存在故障,后面拆电机的时候再检查。最后再留下一个疑问,这个机器人的回充没有用红外管,机器人是如何识别基站进行返回充电的(因为只买了本体,没买充电桩,不确定充电桩的形状,是不是利用点云识别不确定)懂的请留言。全志的R16,封装是 BGA282,那这个板子至少是4层板,小鱼盲猜 6 层板,知道的小伙伴欢迎留言。 阅读详情

12.1    枚举类型

枚举类型基实就是一些常量和一个实例字段。

强类型,枚举之间进行不能隐式转换

枚举类型直接派生于System.Enum,后者派生于System.ValueType,值类型,可以使用装箱/拆箱

不能定义方法/属性/事件。

同一个枚举中,多个枚举符号有相同的数值,数值转符号时,会返回其中第一个符号。(注意理解)

枚举类型要与使用它的类在同一级。

默认为int,可以指定枚举成员的类型,只有int,uint,byte,sbyte,long,ulong,short,ushort这8种基元类型。

可以使用操作符作用于枚举类型,实际上是作用于相应的value实例字段,如++。

可以将枚举类型的实例显示转型为另一个不同的枚举类型,其实是先转为值,再反过去在另一个枚举中根据值找对应枚举值。

可以显示将枚举类型的实例转型为一个数值类型。

C 枚举类型 - 书山有路 - hmyhuo1983的博客    public enum Color

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客    C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客        Red,

C 枚举类型 - 书山有路 - hmyhuo1983的博客        Black,

C 枚举类型 - 书山有路 - hmyhuo1983的博客        White

C 枚举类型 - 书山有路 - hmyhuo1983的博客    }

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客    public enum Sentence

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客    C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客        hello,

C 枚举类型 - 书山有路 - hmyhuo1983的博客        bye

C 枚举类型 - 书山有路 - hmyhuo1983的博客    }

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客    class Program

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客    C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客        static void Main(string[] args)

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客        C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客            //使用运算符,++

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Color a = Color.Red;

C 枚举类型 - 书山有路 - hmyhuo1983的博客            ++a;

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Sentence s;

C 枚举类型 - 书山有路 - hmyhuo1983的博客            //两个不同的枚举相互转换, 但是发现Color.White值为2,相应在Sentence中找不到,所以直接返回整数2

C 枚举类型 - 书山有路 - hmyhuo1983的博客            s = (Sentence)Color.White;    //等价于(Sentence)1;

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客            //两个不同的枚举相互转换,返回枚举值Black

C 枚举类型 - 书山有路 - hmyhuo1983的博客            s = (Sentence)Color.Black;

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客            //直接输出White枚举值, 显式转为整数

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Console.WriteLine(Color.White);         //输出white

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Console.WriteLine((Int32)Color.White);  //输出2

C 枚举类型 - 书山有路 - hmyhuo1983的博客        }

C 枚举类型 - 书山有路 - hmyhuo1983的博客    }

如 enum Color{Red=1, White=2}对应IL:

C 枚举类型 - 书山有路 - hmyhuo1983的博客

可以看到,枚举只是一个在其中定义一系列常量字段和实例字段的结构。

如果只使用Color.Red这样的类型,则会作为常量处理,从而代码不再引用定义了的枚举类型,可以删除相应的dll(具体见第7章);

如果使用Color c = new Color();这样的语法,那么依赖于引用,不可以删除相应的dll

枚举方法列表:

1.GetUnderlyingType静态方法,获取枚举类型值的核心类型:

C 枚举类型 - 书山有路 - hmyhuo1983的博客            //返回System.Int

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Enum.GetUnderlyingType(typeof(Color));

2.ToString()方法

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Color c = Color.Black;

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Console.WriteLine(c);                   //输出Black

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Console.WriteLine(c.ToString());        //输出Black

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Console.WriteLine(c.ToString("G"));     //输出Black,以上都是泛型格式

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Console.WriteLine(c.ToString("D"));     //输出1,十进制

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Console.WriteLine(c.ToString("X"));     //输出00000001,十六进制

对于c.ToString("X")十六进制格式,A-F始终是大写字母。此外,输出的数位个数取决于Color的基本类型:

    byte/sbyte      2位

    short/ushort    4位

    int/uint            8位

    long/ulong     16位

3.Format静态方法,功能基本同ToString()方法,但允许value传递一个数值,而不仅仅是一个Enum类型

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Enum.Format(typeof(Color), 3, "G");

4.GetValues静态方法,返回一个数组,数组中为所有的枚举类型名称:

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Color[] colors = (Color[])Enum.GetValues(typeof(Color));

5.static String GetName(Type enumType, Objbect value)静态方法,返回数值的字符串表示

6.static String[] GetNames(Type enumType),返回方法5的数组表示

7.Parse静态方法,将一个符号转换为枚举类型的一个实例:

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Color cc1 = (Color)Enum.Parse(typeof(Color), "2");

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Color cc2 = (Color)Enum.Parse(typeof(Color), "Black");         //可以是值,也可以是枚举类型名称

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Color cc3 = (Color)Enum.Parse(typeof(Color), "Black", true);   //可选参数true表示忽略大小写

8.IsDefined静态方法,判断一个数值对于一个枚举类型是否合法:

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Enum.IsDefined(typeof(Color), 10);  //返回false,Color中没有10

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Enum.IsDefined(typeof(Color), "Black");  //返回true

常用于参数验证:

C 枚举类型 - 书山有路 - hmyhuo1983的博客        public void SetColor(Color c)

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客        C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客            if (!Enum.IsDefined(typeof(Color), c))

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客            C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客                //抛出异常,c不适合Color

C 枚举类型 - 书山有路 - hmyhuo1983的博客            }

C 枚举类型 - 书山有路 - hmyhuo1983的博客        }

注:Enum.IsDefined方法慎用,因为要区分大小写查找;使用反射机制,速度慢。

9.ToObject静态方法,一系列方法,如Enum.ToObject (Type, Byte),将Int32,Byte等类型实例转为枚举类型的实例(由于返回都是Object,所以要显示转型)

12.2    位标志 bit flag

位标志是一个位集合,其中有些位on,有些位off;而枚举是一个数值,是位集合中若干值的累加。

在枚举上应用[Flags]属性,就可以用枚举来表示一组可以组合的位标志,一般要定义一个值为0的None符号。

C 枚举类型 - 书山有路 - hmyhuo1983的博客[Flags]

C 枚举类型 - 书山有路 - hmyhuo1983的博客public enum FileAttributes

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客    ReadOnly = 0x0001,

C 枚举类型 - 书山有路 - hmyhuo1983的博客    Hidden = 0x0002,

C 枚举类型 - 书山有路 - hmyhuo1983的博客    System = 0x0004

C 枚举类型 - 书山有路 - hmyhuo1983的博客}

这时,就可以使用位运算来操作:

逻辑与,判断是否有这个枚举值

C 枚举类型 - 书山有路 - hmyhuo1983的博客        //以下代码,先取出文件的属性列表——是一个位集合,

C 枚举类型 - 书山有路 - hmyhuo1983的博客        //与FileAttributes.Hidden做逻辑:如果位集合中有FileAttributes.Hidden,则返回FileAttributes.Hidden

C 枚举类型 - 书山有路 - hmyhuo1983的博客        String file = @"C:\Boot.ini";

C 枚举类型 - 书山有路 - hmyhuo1983的博客        FileAttributes attributes = File.GetAttributes(file);

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客        if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden) C 枚举类型 - 书山有路 - hmyhuo1983的博客{ }

逻辑或,组合出所需的枚举列表,一般用来设置:

C 枚举类型 - 书山有路 - hmyhuo1983的博客        File.SetAttributes(path, FileAttributes.ReadOnly | FileAttributes.Hidden);

对位标记Enum调用ToString()方法,数值转字符串:

    先检查是否应用了[Flags]属性

        如果没有,就查找与该数值匹配的Enum符号并返回,没有匹配就返回数值。

        如果有,就获取Enum降序排列的数值集合A,将A中的数值“按位与”Enum实例中的数值,将结果等于数值的Enum项附加到输出字符串,以逗号分割,如"Read,Write"

        有两种特殊情况:

            1.一个数值不能由Enum的若干项组合,则返回该数值

            2.应该定义0。

对位标记Enum调用Parse()方法,字符串转数值:

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Enum.Parse(typeof(Color), "Query");

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Enum.Parse(typeof(Color), "Query, Read");

C 枚举类型 - 书山有路 - hmyhuo1983的博客            Enum.Parse(typeof(Color), "28");

    处理过程如下:

        1.删除字符串中所有空白字符

        2.如果字符串以+/-/数字开始,那么字符串被认为是一个数字,直接转型为对应数值的字符串

        3.以逗号分割字符串,在Enum中查找相应符号的数值,按位或取值并返回

不要对位标记Enum调用IsDefined()方法,因为,

    传字符串,位标记中含有逗号,但永远找不到含有逗号的枚举符号;

    传数值,永远返回false

第十三章 枚举类型与位标记 

一、 枚举类型 

1、 使用枚举类型的理由: 

l 枚举类型是得程序更容易编写、阅读、维护,在代码中使用符号名称代替数字是程序设计的一贯主张。 

2 强类型的,便于类型检验 

2、 注意事项: 

1枚举类型继承自System.Enum,System.Enum又继承自System.ValurType 

2枚举类型不能定义方法、属性、事件 

3枚举类型为常数而非只读字段,因此可能引入版本问题(见第八章的相关讨论) 

4 将枚举类型与引用它的类型定义在同一层次上,可减少代码录入的工作量 



3、 System.Enum中方法的应用: 

l public static Type GetUnderlyingType(Type enumType); 
获取用于保存枚举类型实例值得基础类型。声明某枚举类型使用的基础类型语法如下: 
enum Human : byte 
{ 
Male, 
Female 
} 
则调用上述方法Enum.GetUnderlyingType(typeof(Human));将返回System.Byte; 
2 public override string ToString(); 
public string ToString(string); //参数为格式字符串 
public static string Format(Type enumType,object value,string format); 
//Value – 要转换的值,format – 格式字符串(G,g,X,x,D,d,F,f) 
3 public static Array GetValues(Type enumType); 
获取枚举中常数值的数组 
l public static string GetName(Type enumType,object value); 
在指定枚举中检索具有指定值的常数的名称 
4 public static string[] GetNames(Type enumType); 
检索指定枚举中常数名称的数组。 
l public static object Parse(Type, string); 
public static object Parse(Type, string, bool); 
将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象 
l public static bool IsDefined(Type enumType,object value); 
返回指定枚举中是否存在具有指定值的常数的指示,value为常数的值或名称 
l 系列ToObject方法 
返回设置为指定值的、指定枚举类型的实例

using System;
public enum Color

    {

        Red,

        Black,

        White

    }

 

    public enum Sentence

    {

        hello,

        bye

    }

 

    class Program

    {

        static void Main(string[] args)

        {
   //GetUnderlyingType返回枚举类型值的核心类型

            Console.WriteLine(Enum.GetUnderlyingType(typeof(Color)));
            //ToString()方法
   Color c = Color.Black;

            Console.WriteLine(c);                   //输出Black
            Console.WriteLine(c.ToString());        //输出Black
            Console.WriteLine(c.ToString("G"));     //输出Black,以上都是泛型格式
            Console.WriteLine(c.ToString("D"));     //输出1,十进制
            Console.WriteLine(c.ToString("X"));     //输出00000001,十六进制

           Console.WriteLine( Enum.Format(typeof(Color), 1, "d"));

    //Enum.GetValues获取枚举类型的符号
     Color[] colors = (Color[])Enum.GetValues(typeof(Color));
     foreach (Color color1 in colors )
     {
      Console.WriteLine(color1);
     }
            //Enum.GetName返回指定数值的所在枚举的符号,
     Console.WriteLine(Enum.GetName(typeof(Color),1));
        Console.WriteLine(Enum.Parse(typeof(Color), "Black"));
     Console.WriteLine(Enum.IsDefined(typeof(Color), 10));

        }

    }



二、 位标记 

l 使用System.FlagsAttributes定制特性,使得ToString或Format方法可以查找枚举数值中的每个匹配符号,将它们连接为一个字符串,并用逗号分开;Parse方法可用该特性拆分字符串并得到复合的枚举类型 

l 使用格式字符串F或f 也有同样的效果 

下面的示例说明上述情况 

using System; 



[Flags] //定制特性 

public enum Human : byte //定制基本类型 

{ 

Male = 0x01, 

Female = 0x10 

} 



public class EnumTest 

{ 

public static void Main() 

{ 

Human human = Human.Male | Human.Female; //人妖? 



Console.WriteLine(human.ToString()); //使用Flags定制特性的情况 

//Console.WriteLine(human.ToString("F")); //没有使用Flags定制特性的情况 



Console.WriteLine(Enum.Format(typeof(Human), human, "G"));//使用Flags定制特性的情况 

//Console.WriteLine(Enum.Format(typeof(Human), human, "F"));//没有使用Flags定制特性的情况 



human = (Human)Enum.Parse(typeof(Human), "17"); 

Console.WriteLine(human.ToString()); //使用Flags定制特性的情况 

//Console.WriteLine(human.ToString("F")); //没有使用Flags定制特性的情况 

} 

} 



/*运行结果 

Male, Female 

Male, Female 

Male, Female 

*/ 

注:上述程序中的注释为不使用Flags特

 

 

enum Complexion//肤色

        {

          White,

          Black,

          Yellow

        }

这是一个枚举,没有什么特别。

说一下枚举的特点吧,其实枚举就是一系列符号和一系列对应的值,在上面的例子中,枚举的基类型是Int32类型,这是默认的类型,对应的各个枚举项,White=0,Black=1;Yellow=2;这就是一个符号与值的对应,CLR在用枚举时,是用的值,并不是符号,符号是开发人员用来能明确其值的含义的。

所有枚举都是从System.Enum派生来的,System.Enum又是从System.ValueType派生来的,System.ValueType的父类是System.Object。即然从System.Enum派生的,当然枚举都属于值类型了。

现在我们看看IL中的Complexion枚举是个什么样子

il语言:

.class private auto ansi sealed Complexion extends System.Enum

{

.field public static literal valuetype complexion black=int32(0x000000001)

.field public static literal valuetype Complexion while=int32(0x000000002)

.field public static literal valuetype Complexion yellow=int32(0x000000003)

.field public specialname rtspecialname int32 value_

}

 

 

C 枚举类型 - 书山有路 - hmyhuo1983的博客

在IL中我们能看到它是从System.Enum继承的,还会发现所有的符号都是一个常量,即static  literal这个标识。

其实可以用这样一个C#代码来说明枚举Complexion

Internal struct Complexion:System.Enum

{

 public const Complexion White==(Complexion)0;

 public const Complexion Black==(Complexion)1;

 public const Complexion Yellow==(Complexion)2;

 public Int32 value_;

}

当然,上面的代码如果写到C#环境中是编译不过的,因为System.Enum是个特殊的类,不允许派生子类型。

在上面的伪代码中,可以看到,每个符号(White,Black,Yellow),都是一个常量,关且是Complexion类型的。同时在Complexion内部还有一个常量,Value_,从有关资料查询说是包含一个Complexion的符号的值。同时期待了解这个变量的准确用途的朋友告知。      Enumerted Type
     1.枚举类型实际上一对名称和值的集合。
     2.使用枚举的好处:
          1)易于识别
          2)枚举类型是强类型的
     3.枚举类型从IL语言来看,实际上是编译成几个常量字段和一个实例字段。     
     4.枚举类型的定义和类一个级别,但是不能定义属性,方法,事件等。
     5.枚举类型继承自System.Enum,后者继承自System.valueType,后者继承自System.Object.故属于值类型。
     6.枚举类型的方法:
          1)Enum.GetUnderlyingType()获得枚举类型的基类型(C#中默认是int)
          2)Enum.GetValues() 返回一个枚举类型名称数组
          3)Enum.GetName() 返回名称标示
          4)Enum.Format()
          5)Enum.Parse()
          6)Enum.IsDefined()
     7.可以指定int,uint,byte,sbyte,long,ulong,short,ushort这8种基元类型为枚举类型的基类型,默认为int.
     8.枚举类型经常用在方法参数,返回值,属性,字段中。

 

C# 枚举(enum)-基础

 


 

枚举提供成组的常数值,它们有助于使成员成为强类型以及提高代码的可读性。在 C# 中,使用 enum 来声明枚举。

枚举分为简单枚举和标志枚举两种,将在第三节中详细介绍这二者。

基本语法示例

enum Day { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

以下格式也可以:

enum Day

{

    Sun,

    Mon,

    Tue,

    Wed,

    Thu,

    Fri,

    Sat

};

枚举类型

枚举类型可以是:byte、sbyte、short、ushort、int、uint、long、ulong,如果没有指定类型,则默认为 int 类型。指定类型示例:

enum Day : byte { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

枚举数的值

默认情况下,第一个枚举数的值为 0,后面每个枚举数的值在前一个枚举数的值基础上递增 1。当然,也可以自行指定,例如:

enum Day { Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat };

enum Range { MIN = 0, MAX = 255 };

enum Range2 { MIN, M1 = 50, M2, MAX = 255 }; //MIN 为 0,M2 为 51

枚举数大小写敏感

比如以下枚举有两个枚举数:

enum EnumTest { Sun, sun }; //尽管如此,我们仍不推荐这样写

取枚举数的值

虽然枚举有类型,但取枚举数的值时,仍然需要进行类型转换。

public partial class _ENUM : System.Web.UI.Page

{

    enum Range { MIN = 0, MAX = 255 };

   

   

    protected void Page_Load(object sender, EventArgs e)

    {

        Response.Write(Range.MAX); //输出为:MAX

        Response.Write("<br>");

        Response.Write(((int)Range.MAX).ToString()); //输出为:255

    }

}

枚举不能放在函数中

枚举可以与类平级,也可以作为类的 field,但不能放在函数中。可以加 public 等修饰符。

以下是使用枚举时几条好的建议。

优先考虑使用枚举,而不是类的静态常量

比如:

public static class Day

{

    public static int Sun = 1;

    public static int Mon = 2;

    public static int Tue = 3;

    //...

}

应该使用如下的枚举:

enum Day { Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat };

如果参数、返回值、变量等类型可以是枚举,则不要使用其它基础类型

比如:

Range r = Range.MAX; //好

int r = (int)Range.MAX; //不好

枚举命名

枚举一般使用名词或名词组合,简单枚举使用单数,标志枚举使用复数。

大多数情况下不需要更改枚举的默认类型

也就是说大多数情况下,使用 int(System.Int32)作为枚举类型。除非:

  • 枚举是标志枚举,且标志多于 32 个(此时 int 类型装不下)。
  • 枚举被非常大量且频繁地使用,为了节约空间使用小于 int 的类型。
  • 不得不使用其它类型的情况。

不要在枚举中设置哨兵

我们可能觉得在枚举的两端加上哨兵,这样在判断一个数是否在枚举中时,只需要判断是否在哨兵之中。非常不幸,我们不应该这么做,这破坏了枚举的意义。

enum Day {FirstValue, Sun, Mon, Tue, Wed, Thu, Fri, Sat, LastValue }; //FirstValue、LastValue 应该去掉

 

  • 简单枚举包含的值不用于组合,也不用于按位比较。
  • 标志枚举应使用按位 OR 操作进行组合。

简单枚举

前面提到的 Day、Range 都可以称之为简单枚举,因为不能将他们各自的值组合起来。

标志枚举

标志枚举的设计有两点要注意。

  • 指明 FlagsAttribute,以指示可以将枚举作为位域(即一组标志)处理。
  • 枚举中各标志的值应该是以 2 的幂来赋值,即:1、2、4、8、16、32……

举个例子,假如我们在设计 Windows 窗口程序,窗口有最小化、最大化、关闭按钮,我们想任意组合显示,也就是说我们可以显示其中的任意 0 个或一个或多个按钮。

如果使用简单枚举,按照排列组合,我们要使用 1 + 3 + 3 + 1 = 8 个枚举数,如果这里不是三个按钮,而是四个按钮,枚举数就更多了。所以这样不现实。

为什么这里使用简单枚举不现实呢?因为简单枚举不能组合,采用标志枚举就可以轻松解决了。

[Flags]

public enum WindowStyle

{

    MINIMUM_BUTTON = 1, //十六进制表示为 0x0001

    MAXIMUM_BUTTON = 2,

    CLOSE_BUTTON = 4

}

我们在设置窗口样式时,利用 OR 自由组合:

WindowStyle ws = WindowStyle.MINIMUM_BUTTON | WindowStyle.CLOSE_BUTTON; //表示既有 MINIMUM_BUTTON 也有 CLOSE_BUTTON

这就是为什么标志的值要按 2 的幂排列的原因了,也是为什么标志多于 32 个时不能使用 int 类型的原因了。

通常我们为常用的标志组合提供特殊的枚举值

仍然以上述窗口为例,可知大多数情况下,我们均要显示这三个按钮,所以每次使用时都要用:

WindowStyle ws = WindowStyle.MINIMUM_BUTTON | MAXIMUM_BUTTON | WindowStyle.CLOSE_BUTTON;

实在有些繁琐,我们可以修改枚举为如下:

[Flags]

public enum WindowStyle

{

    MINIMUM_BUTTON = 1,

    MAXIMUM_BUTTON = 2,

    CLOSE_BUTTON = 4,

    ALL_BUTTON = 7

}

增加一个 ALL_BUTTON 为前三个标志的值。使用时直接用 ALL_BUTTON 就可以了。

 

从长远来看,创建枚举可以节省大量的时间,减少许多麻烦。使用枚举比使用无格式的整数至少有如下三个优势:

●       枚举可以使代码更易于维护,有助于确保给变量指定合法的、期望的值。

●       枚举使代码更清晰,允许用描述性的名称表示整数值,而不是用含义模糊的数来表示。

●       枚举使代码更易于键入。在给枚举类型的实例赋值时,VS.NET IDE会通过IntelliSense弹出一个包含可接受值的列表框,减少了按键次数,并能够让我们回忆起可能的值。public enum FileStates{Begin=1,Pause=2,RollBack=3,Success=4};

枚举类型都是值类型。System.Enum是一个抽象类(abstract class),所有枚举类型都直接继承自它,当然也同时继承了它的所有成员。所有的值类型都是System.ValueType的后代,枚举类型也不例外,枚举类型直接继承自System.Enum,而System.Enum却又直接继承自System.ValueType的,所以,枚举类型也是System.ValueType的后代。

值类型都是System.ValueType的后代”,但System.ValueType的后代不全是值类型,System.Enum就是唯一的特例!在System.ValueType的所有后代中,除了System.Enum之外其它都是值类型。事实上,我们可以在.NET的源代码中找到System.Enum的声明:

C 枚举类型 - 书山有路 - hmyhuo1983的博客public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible

  • 1. 所有枚举类型(enum type)都是值类型。
  • 2. System.Enum和System.ValueType本身是引用类型。
  • 3. 枚举类型(enum type)都是隐式的直接继承自System.Enum,并且这种继承关系只能由编译器自动展开。但System.Enum本身不是枚举类型(enum type)。
  • 4. System.Enum是一个特例,它直接继承自System.ValueType,但本身却是一个引用类型。

A:枚举类型可以被装箱成System.Enum、System.ValueType、System.Object或者System.IConvertible、System.IFormattable、System.IComparable。

注意:在.NET 1.1上,枚举类型只能被装箱到System.Enum、System.ValueType、System.Object;而在.NET 2.0上,枚举类型还能被装箱到System.Enum所实现的三个接口:System.IConvertible、System.IComparable、System.IFormattable。对应的装箱操作既可以为隐式的也可以是显式的。

枚举类型与整数类型有一定的关系。事实上,每一个枚举类型都有与之相对应的整数类型,我们称该整数类型为底层类型(underlying type),默认的情况下使用,.NET使用System.Int32。当然,你可以手动将其指定为其他的整数类型:

能被指定为枚举的底层类型的只能是如下所列的整数类型:byte, sbyte, short, ushort, int, uint, long, ulong。

如果你没有手动指定成员的值的话,从上往下看,各成员的值为:0, 1, 2, ...。说罢了,就是一个非负整数等差数列,其初值为0,步长为1。例如:

 public enum Alignment

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客  C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Left,    // 0

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Center,    // 1

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Right    // 2

C 枚举类型 - 书山有路 - hmyhuo1983的博客  }

那么被赋值的成员的值就是你所指定的值。当然,无论你是否手动指定枚举成员的值,递增步长都不会变,总是为1。为了测试你是否理解,请说出下面枚举个成员的值以及你的判断理由(请用人脑而不是电脑来运行以下代码):

public enum DriveType : sbyte

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客  C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客      CDRom,

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Fixed = -2,

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Network,

C 枚举类型 - 书山有路 - hmyhuo1983的博客      NoRootDirectory = -1,

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Ram,

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Removable = Network * NoRootDirectory,

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Unknown

C 枚举类型 - 书山有路 - hmyhuo1983的博客  }

public enum CustomerKind

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客  C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Normal = 90,

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Vip = 80,

C 枚举类型 - 书山有路 - hmyhuo1983的博客      SuperVip = 70,

C 枚举类型 - 书山有路 - hmyhuo1983的博客      InActive = 100

C 枚举类型 - 书山有路 - hmyhuo1983的博客  }

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客  public class Customer

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客  C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客      public readonly CustomerKind Kind;

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客      private double m_Payment;

C 枚举类型 - 书山有路 - hmyhuo1983的博客      public double Payment

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客      C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客          return m_Payment * (int)Kind / 100;

C 枚举类型 - 书山有路 - hmyhuo1983的博客      }

为枚举CustomerKind的每个成员都赋了一个特定的值,该值其实就是顾客购物折扣百分率。而在Customer类中,Payment属性就通过强类型转换来获取枚举成员的值(也就是购物折扣率),并用于货款计算。从这里可以看出,获取枚举成员的值还可以通过强类型转换方式。

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客      // Code hereC 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客  }

枚举类型可以强制转换为整数,整数也可以强制转换为枚举类型

Alignment a = (Alignment)1;但这种机制可能使你遇到一些麻烦

public static bool IsAlignment(Alignment a)

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客  C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客      switch(a)

       {

    case Alignment.Left:

    case Alignment.Center:

    case Alignment.Right:

      return true;

    default:

      return false;

      }

C 枚举类型 - 书山有路 - hmyhuo1983的博客  }

枚举类型转换(解析)成字符串类型

最简单的方法就是使用System.Enum的public override string ToString();  或者把枚举类型转换为IConvertible接口,再调用该接口的string ToString(IFormatProvider provider);

 static void Main()

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客  C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Alignment a = Alignment.Right;

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Console.WriteLine("Alignment is {0}.", a.ToString());

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客      FontStyle fs = FontStyle.Bold | FontStyle.Underline;

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Console.WriteLine("FontStyle is {0}.", fs.ToString());

C 枚举类型 - 书山有路 - hmyhuo1983的博客  }

手动指定格式参数:Console.WriteLine("Alignment is {0}.", a.ToString("d"));

一个表示枚举成员的字符串,如何将其解析为对应枚举类型:

这时你就需要System.Enum的public static object Parse(  Type enumType, string value,  bool ignoreCase  );

static void Main()

C 枚举类型 - 书山有路 - hmyhuo1983的博客C 枚举类型 - 书山有路 - hmyhuo1983的博客  C 枚举类型 - 书山有路 - hmyhuo1983的博客{

C 枚举类型 - 书山有路 - hmyhuo1983的博客      string name = "Right";

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Alignment a = (Alignment)Enum.Parse(typeof(Alignment), name, false);

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Console.WriteLine(a.ToString());

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客      string names = "Bold, Italic, Underline";

C 枚举类型 - 书山有路 - hmyhuo1983的博客      FontStyle fs = (FontStyle)Enum.Parse(typeof(FontStyle), names, false);

C 枚举类型 - 书山有路 - hmyhuo1983的博客

C 枚举类型 - 书山有路 - hmyhuo1983的博客      Console.WriteLine(fs.ToString());

C 枚举类型 - 书山有路 - hmyhuo1983的博客  }

不应该使用枚举的情况:C 枚举类型 - 书山有路 - hmyhuo1983的博客

枚举类型表达了一种稳定的分类标准。当你查看.NET Framework BCL中的枚举类型,你会发现它们几乎没有任何改变的可能或者趋势,表现出一种稳定性。所以,当你所要表达的分类标准也同样具备这种稳定性时,你就可以考虑枚举类型了。那么什么情况下不使用枚举呢?一般说来,当分类标准不闭合时——即新的子分类随时有可能产生或者现有子分类随时有可能被替换——你就应该考虑使用其他的方式来表达了.

【红外技术】DDE算法:HE在红外图像可视化上的应用(附源码) 并且数据一般是以 8 的整数倍的位宽在电子系统中应用,因此大多数的显示器的显示位宽为 8bit,共 256 个灰阶。为了使红外图像可视化,因此需要一种“数据压缩”技术,还需要既可能的不丢失原始图像信息。HE后的图像直方图分布比较均匀离散,图像对比度好。但是HE算法只是适用某些图像,它是将灰度集中区域进行拉伸得到,也会放大该集中区域的噪声,它是一种“不公平”的映射。以下是红外细节增强算法的演示,很明显右边的图像,展现了更多的图像细节,对于小目标的观测非常友好。文章已于2019-12-02修改。 阅读详情

相关推荐

利用腾讯云轻量服务器快速搭建网站CDN

腾讯云的轻量最近在主机和站长中间可谓是占尽来风头,优秀的线路,低廉的价格使得越来越多的人开始使用腾讯云的轻量级服务器来部署应用。由于腾讯云轻量服务器的海外服务器电信走的是CN2GIA线路带宽30m挺适合做CDN的,我就记录一下如何利用腾讯云香港的轻量服务器搭建一个CDN。 购买服务器 首先选购服务器,最近腾讯云在做活动,力度很大国内备案用户可以选用国内的服务器最低128元/年,未备案的可以选用香港或者新加坡的服务器。 购买链接 服务器系统选Debian、Ubuntu、centos都可以 一键脚

demo_top的博客 2564

C# 枚举类型

12.1枚举类型 枚举类型基实就是一些常量和一个实例字段。 强类型,枚举之间进行不能隐式转换 枚举类型直接派生于System.Enum,后者派生于System.ValueType,值类型,可以使用装箱/拆箱 不能定义方法/属性/事件。 同一个枚举中,多个枚举符号有相同的数值,数值转符号时,会返回其中第一个符号。(注意理解) 枚举类型要与使用它的类在同一级。 默认为i...

djun0426的博客 695

Cadence SIP Layout 简单教程-第一章

以摄像头模组软硬结合板为例,描述layout的整个完整过程,从而掌握基本技能。 第一章 准备工作 第一节 原理图不用说layout前需要绘制原理图,原理图不在本文讨论范围内,所以列为准备工作。 需要特别说明的是,绘制原理的最终目的是导出网络表,网络表中的重要参数footprint是让layout软件选择正确封装的关键,所以这里讲解一下原理图设置footprint的位置。在原理图中双击零件,...

whp1920的博客 1万+

C# 枚举中使用System.Flags 位运算

C# 枚举 特性

u011736479的博客 1382

泛微OA与金蝶云星空深度集成实战:审批与表单双场景解析

本文深入解析泛微OA与金蝶云星空的深度集成实战,聚焦审批流程与表单对接两大核心场景。通过具体案例,详细阐述了如何实现业务数据与审批流程的自动联动,打破数据孤岛,提升企业运营效率与数据一致性,并分享了接口设计、安全策略及实战避坑指南。

4k5l6j7h8的博客 466

MEG预处理-Brainstorm

Brainstorm下载和安装 去Brainstorm官网进行下载:打开网页后,点击左侧Download;在跳出来的界面中进行简单的注册,注册完成后可以进行下载 解压后得到“brainstorm3”的文件夹,里面包含Brainstorm工具包的所有文件,把这个文件夹放在某个路径如"E:\matlab_tools\brainstorm3"即可 同样在某个路径建立空的文件夹命名为:brainstorm_db用于工具包运行过程中自动存储生成的文件,所以这个文件中生成的数据不要手动移动删除 在Matlab中,把.

AxeChen的博客 6119

C语言枚举类型的大小

主流编译器如:gcc、vc、MinGW-gcc等枚举变量均为4字节。少量编译器会根据枚举个数做优化,如只有3个枚举值时,size可能为1。 enum长度不确定会带来可移植性问题,如果第三方库API接口使用enum类型,编译和调用库时一旦有关enum长度的编译器设置不一致,API接口层对数值的解析就不匹配。比如上层应用编译时没有用-fshort-enums,默认用4字节空间来存储使用enum...

Oliver King 的小窝 1万+

HIDL概述

HIDL背景 Treble 是 Google Android 团队的一项重大项目,意在 Android 操作系统框架在架构方面的一项重大改变,旨在让制造商以更低的成本更轻松、更快速地将设备更新到新版 Android 系统。Android 7.x 及更早版本中没有正式的供应商接口,因此设备制造商必须更新大量 Android 代码才能将设备更新到新版 Android 系统: 图1 Treble ...

u013357557的专栏 2万+

C++中关于枚举的使用(enum)

枚举

Littlehero_121的博客 5284

库存管理系统项目部署方案(基于jdk17)

不需要安装到服务器,运维本地安装就行,主要是用来编译前端代码的。构建完成后将dist文件夹复制到服务器内。

程序员诚哥 6358

MobSF-v3源代码分析(一)

移动安全框架(MobSF)是一种自动化的移动应用程序(Android/iOS/Windows)测试框架,能够执行静态、动态和恶意软件分析。 它可用于Android、iOS和Windows移动应用程序的有效和快速安全分析,并支持二进制文件(APK,IPA和APPX)和压缩源代码。 MobSF可以在运行时为Android应用程序进行动态应用程序测试,并具有由CapFuzz(一种特定于Web API的安全扫描程序)提供支持的Web API模糊测试。MobSF旨在使您的CI/CD或DevSecOps管道集成无缝。

武天旭的博客 8959

C语言enum(枚举)数据类型

#include <stdio.h> //enum Weekday只是一个数据类型, //规定了该类型的变量值必须是哪些 enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Staturday, Sunday }; void f(enum Weekday i) { //enum Weekday类

Dean_Deng的专栏 2788

SAP RAP 校验全流程:从 EML 读取到消息上屏与阻止落库

本文系统梳理了 SAP ABAP RAP 中的校验流程(The Validation Process),结合 Airline/Connection 案例,详细讲解了三类核心校验:语义键唯一性、外键有效性和字段间一致性。文章覆盖了 EML 的 READ ENTITIES 操作、reported-* 与 failed-* 结构的使用方法、消息创建与字段绑定技巧,以及处理草稿数据时的 UNION 查询策略。通过代码示例演示了如何实现校验逻辑、生成错误消息并阻止无效数据持久化,同时提供了常见问题的排查建议。全文注重

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 331

(18)C# 基础 —— 枚举类型(enum)

.NET C# Web开发学习之路(17)—— 枚举类型(enum) 枚举类型(也称为枚举)提供了一种有效的方式来定义可能分配给变量的一组已命名整数常量。 例如,假设你需要定义一个变量,其值表示一周内的某一天。 该变量只会存储七个有意义的值。 若要定义这些值,可以使用枚举类型,该类型是使用 enum 关键字声明的。 enum Day { Sunday, Monday, Tuesday,...

编程菜鸟0604的博客 1298

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

蓝鸥Unity开发之C#基础视频枚举类型课后习题

蓝鸥Unity开发之C#基础视频枚举类型课后习题

蓝鸥_嘟嘟的小屋的博客 1720

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C#基础 Enum 输出枚举类型的数值和名称

 .NET Framework : 4.7.2        IDE : Visual Studio Community 2019         OS : Windows 10 x64     typesetting : Markdown         blog : blog.youkuaiyun.com/yushaopu        gi...

心少朴 6053

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【C#基础详解】(八)枚举类型

学习枚举类型的使用,int类型和枚举类型的互相转换,string类型和枚举类型的互相转换,枚举类型结合switch-case语句的案例。

伯恩的博客 3414

Unity中的C#编程基础:枚举类型

枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。 C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。 声明 enum 变量的一般语法: enum <enum_name> { enumeration list }; 其中, enum_name 指定枚举的类型名称。 enumeration list 是一个用逗号分隔的标识符列表。 枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0.例如: enum

一直在笑的博客 1747

C#语言基础——结构体和枚举类型

结构体和枚举类型 一、结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数、常数、字段、方法、属性、索引器、运算符、事件和嵌套类型的值类型。结构在几个重要方面不同于类:结构为值类型而不是引用类型,并且结构不支持继承。 用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等。这可以节省内存,因为没有如类对...

dhope1234的博客 368

C# 基础--枚举类型

在使用枚举类型时候,什么时候获取的是枚举变量,什么时候获取的是枚举值?也就是如何获取字符描述或者对应的数值。 结论:   1.使用 枚举变量.GetHashCode() 方法可以获取枚举值,即数值。   2.对枚举变量直接打印,得到的是字符描述信息。   3.创建枚举变量时候,如果没有用枚举成员赋值对其赋值时,有两种情况:       a.枚举值定义不从0开始,得到的枚举变量的值是0,得到的字符描述也是0;   &nb

Nameseven的博客 687

c#基础--枚举类型

枚举: 定义一种枚举类型并且在定义这种类型时我们要指定该类型的所有值 语法: enum 类型名称{值1,值2,值3,...,值n} 枚举的定义一般和类定义在同一级别,这样在同一个命名空间下的所有类都可以使用该枚举类型(方法中和类中也可以) 实例: 定义一个枚举类型: enum Gender { 男, 女 } 在放方法中使用: ...

weixin_33834075的博客 139

vc 枚举类型大小_【C#基础】枚举类型:对于枚举enum该知道的定义

枚举类型的定义:枚举类型(enumeration)是 C++ 中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。定义格式:枚举类型的定义格式为:enum <类型名>{<枚举常量表>};关键字enum——指明其后的标识符是一个枚举类型的名字。枚举常量表——由枚举常量构成。"枚举常量"或称"枚举成员",是以标识符形 式表示的整型量,表示枚举类型的取值。枚举...

weixin_39995764的博客 334

【C#基础笔记】07_常量枚举类型

一  常量的定义(通常对于不可改变的量,定义为常量)       const double  PI = 3.14  (const  类型  变量名 = 常量值) 1. 常量只能在初始化的时候赋值,其他时候不允许赋值 二  枚举类型 1. 枚举的定义(指定这个类型的所有的可能的值;限定用户的输入):     enum 枚举类型名     {  值1,        值2,  

s00229295的博客 311

C#——枚举类型

C#——枚举类型 枚举类型 是由基础整型数值类型的一组命名常量定义的值类型。 若要定义枚举类型,请使用 enum 关键字并指定枚举成员 的名称: enum Season { Spring, Summer, Autumn, Winter } 默认情况下,枚举成员的关联常数值为类型 int;它们从零开始,并按定义文本顺序递增 1。 可以显式指定任何其他整数数值类型作为枚举类型的基础类型。 还可以显式指定关联的常数值,如下面的示例所示: enum ErrorCode : usho

weixin_43945471的博客 2358

C#基础 结构体 枚举类型

结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样。 一、定义的例子: struct student { public int nianling; public int fenshu; public string name; public string sex; public int sum; } 以上的语句就是定义一个名称为student的结构体,其中...

weixin_33849215的博客 165

C#基础教程 | 常量,枚举类型和结构体

** - 1. 常量 语法: const 数据类型 常量名=值; 常量名的命名一般全是大写,单词与单词直接下划线分割。如:IP//NAME ** ** -2 枚举类型 枚举作用:规范开发///不是放在main函数中 放在 namespace下,这样在当前的命名空间下,所有类(class)都可以使用该枚举。 使用枚举类型: 枚举类型 变量名=枚举类型.值; 枚举类型往往是一些事先定义好的,在项目中公共使用的一些数据。 public enum 枚举名 { 值1, 值2, 值N } -3 结构

weixin_51197655的博客 449
上一篇: Unity视频播放的各种实现方式汇总
下一篇: Unity5.x EventSystem事件系统
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值