黑马程序员————枚举类型和数据结构

来源:互联网 发布:淘宝男士牛仔裤 编辑:程序博客网 时间:2024/05/21 11:03

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------- 

 

枚举类型

枚举常量是枚举类型中的值,即枚举值。枚举类型是一种用户定义的类型,只有用户在程序中定义它后才能被使用。用户通常利用枚举类型定义程序中需要使用的一组相关的符号常量。枚举类型的定义格式为:

  enum   <枚举类型名>   {<枚举表>};   

它是一条枚举类型定义语句,该语句以enum保留字开始,接着为枚举类型名,它是用户命名的一个标识符,以后就直接使用它表示该类型,枚举类型名后为该类型的定义体,它是由一对花括号和其中的枚举表所组成,枚举表为一组用逗号分开的由用户命名的符号常量,每个符号常量又称为枚举常量或枚举值。如: 

  (1)   enum   color{red,   yellow,   blue};   
    
  (2)   enum   day{Sun,   Mon,   Tues,   Wed,   Thur,   Fri,   Sat};   
    
  第一条语句定义了一个枚举类型color,用来表示颜色,它包含三个枚举值red,yellow和blue,分别代表红色、黄色和兰色。   
    
  第二条语句定义了一个枚举类型day,用来表示日期,它包含7个枚举值,分别表示星期日、星期一至星期六。   
    
  一种枚举类型被定义后,可以象整型等预定义类型一样使用在允许出现数据类型的任何地方。如可以利用它定义变量。

     (1)   enum   color   c1,   c2,c3;   
    
  (2)   enum   day   today,   workday;   
    
  (3)   c1=red;   
    
  (4)   workday=Wed;   
    
  第一条语句开始的保留字enum和类型标识符color表示上述定义的枚举类型color,其中enum可以省略不写,后面的三个标识符c1,c2和c3表示该类型的三个变量,每一个变量用来表示该枚举表中列出的任一个值。 

 

  第二条语句开始的两个成分(成分之间的空格除外)表示上述定义的枚举类型day,同样enum可以省略不写,后面的两个标识符today和workday表示该类型的两个变量,每一个变量用来表示该枚举表中列出的七个值中的任一个值。   
    
  第三条语句把枚举值red赋给变量c1,第四条语句把枚举值Wed赋给变量workday。   
    
  在一个枚举类型的枚举表中列出的每一个枚举常量都对应着一个整数值,该整数值可以由系统自动确认,也可以由用户指定。若用户在枚举表中一个枚举常量后加上赋值号和一个整型常量,则就表示枚举常量被赋予了这个整型常量的值。如:   
    
  enum   day{Sun=7,   Mon=0,   Tues,   Wed,   Thur,   Fri,   Sat};   
    
  用户指定了Sun的值为7,Mon的值为0。 

若用户没有给一个枚举常量赋初值,则系统给它赋予的值是它前一项枚举常量的值加1,若它本身就是首项,则被自动赋予整数0。如对于上述定义的color类型,red,yellow和blue的值分别为0,1和2;对于刚被修改定义的day类型,各枚举常量的值依次为7,0,1,2,3,4,5,6。   
    
  由于各枚举常量的值是一个整数,所以可把它同一般整数一样看待,参与整数的各种运算。又由于它本身是一个符号常量,所以当作为输出数据项时,输出的是它的整数值,而不是它的标识符,这一点同输出其他类型的符号常量是一致的。 

小注:

(1)枚举类型的作用可以简单理解成限制用户不能随意赋值,只能定义声明枚举类型列举的值。
(2)定义枚举时,不能是int类型。
(3)枚举类型的变量可以强转成int类型。

(4)如何把一个字符串转换成枚举类型。:sex = (Gender)(Enum.Parse(typeof(Gender), "字符串"));

下面是字符串转成枚举类型的小应用

 

  


    数据结构  

 

数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。

结构体属于数据结构,封装着一组整体作为一个逻辑单位的数据和行为

一般我们会纠结于用类还是用结构体。
结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型

类是引用类型:引用类型在堆上分配地址堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑,因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用

  • 虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
  • 虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用


从继承性来说:

  • 结构不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
  • 类是完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承


虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样

从内部结构来说:

  • 结构没有默认的构造函数,但是可以添加构造函数,没有析构函数,没有 abstract 和 sealed(因为不能继承),不能有protected 修饰符,可以不使用new初始化,在结构中初始化实例字段是错误的
  • 类有默认的构造函数,有析构函数,可以使用 abstract 和 sealed,有protected 修饰符,必须使用new 初始化


那如何来选择到底用类还是用结构呢?

  • 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
  • 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组
  • 则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
  • 在表现抽象和多级别的对象层次时,类是最好的选择
  • 大多数情况下该类型只是一些数据时,结构时最佳的选择


    

原创粉丝点击