C#编程语言(六):枚举类型与结构类型

枚举类型

枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。 例如,假设您必须定义一个变量,该变量的值表示一周中的一天。 该变量只能存储七个有意义的值。
若要定义这些值,可以使用枚举类型。枚举类型是使用 enum 关键字声明的。

 

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

如果未在枚举数列表中指定元素的值,则值将自动按 1 递增。 在前面的示例中,Days.Sunday 的值为 0,Days.Monday 的值为 1,依此类推。创建新的 Days 对象时,如果不显式为其赋值,则它将具有默认值 Days.Sunday (0)。 创建枚举时,应选择最合理的默认值并赋给它一个零值。 这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。

使用枚举的好处:

  • 明确为客户端代码指定哪些值是变量的有效值。

  • 在 Visual Studio 中,IntelliSense 列出定义的值。

    可以将任意值赋给枚举类型的枚举数列表中的元素,也可以使用计算值:

     

    enum MachineState
    {
    PowerOff
    = 0,
    Running
    = 5,
    Sleeping
    = 10,
    Hibernating
    = Sleeping + 5
    }
    控件枚举的底层存储

    默认情况下,C#保存枚举值的数据类型是System.Int32(int)。当然我们可以按环境的需要做改变。如程序用在低内存的设备中时,为了省内存我们使用byte类型:

     

    enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };

    声明和使用枚举

    设定了枚举范围和存储类型后,就可以使用它代替所谓的幻数(看不出意义的常数数值)了。枚举是自定义类型,我们可以使用枚举作为局部变量,方法参数,方法返回值等。

    System.Enum 类

    为枚举提供基类。.NET枚举从System.Enum类获得了很多功能,Enum类定义了许多查询和转换某个枚举的方法。

    Enum 类型公开的部分核心成员:

    GetName 在指定枚举中检索具有指定值的常数的名称。

     GetNames 检索指定枚举中常数名称的数组。

    GetType获取当前实例的 Type

    GetUnderlyingType :返回指定枚举的基础类型。

    ToString() 将此实例的值转换为其等效的字符串表示形式。

    GetValues 检索指定枚举中常数值的数组。 

    Parse(Type, String) 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。

  • 结构类型

    结构类型是一种值类型,通常用来封装小型相关变量组,例如,矩形的坐标或库存商品的特征。结构类型很适合在应用程序中对数学、几何及其他“原子”实体建模。结构(和枚举相似)是自定义类型,但不止是一组名称/值对。结构可以包括许多数字字段与操作这些字段的成员的类型。

    注意:

    1.结构可以包含构造函数常量字段方法属性索引器运算符事件嵌套类型,但如果同时需要上述几种成员,则应当考虑改为使用类作为类型。

    2.结构可以实现接口,但它们无法继承另一个结构(结构是隐式sealed,是不可被继承的)。因此,结构成员无法声明为 protected

     

    struct Point
    {
    // Fields of the structure.
    public int X;
    public int Y;
    // A custom constructor.
    public Point(int XPos, int YPos)
    {
    X
    = XPos;
    Y
    = YPos;
    }
    // Add 1 to the (X, Y) position.
    public void Increment()
    {
    X
    ++; Y++;
    }
    // Subtract 1 to the (X, Y) position.
    public void Decrement()
    {
    X
    --; Y--;
    }
    // Display the current position.
    public void Display()
    {
    Console.WriteLine(
    "X = {0}, Y = {1}", X, Y);
    }
    }

    使用结构

        一、创建一个结构变量,在使用前为它的所有公共字段赋值。否则会受到编译错误。

     

    Point myPoint;
    myPoint.X
    = 349;
    //myPoint.Y = 76; 缺少这个赋值,会收到编译错误!
    myPoint.Display();

        二、使用new关键字创建结构变量,它会调用结构的默认构造函数,给公共字段赋默认值。

     

    Point myPoint=new Point();
    //输出 X=0,Y=0
    myPoint.Display();

    结构类型与类类型的区别

        结构类型和类类型实际上都是创建对象的模版,每个对象都包含数据,并提供了处理和访问数据的方法。在语法上,非常相似,主要的区别:

    一、定义使用的关键字不一样,结构使用struct而类类型使用class。

    二、结构是值类型的,而类类型是引用类型的。(注意:虽然结构的初始化使用了new操作符,可是结构对象依然分配在堆栈上,如果不使用new那么在初始化所有字段之前,字段将保持为未赋值状态,且对象不可用。)

    三、结构是无法从另外一个结构或者类继承,本身也不能被继承(结构是隐式sealed)。(注:虽然结构不能被继承,可是结构能够继承接口,方式和类继承接口一样。)

    四、结构类型变量可以不使用new关键字初始化,而类类型的对象必须使用new初始化(静态类除外)。

    如何选择结构还是类

    1.栈(stack)的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。

    2.结构类型很适合在应用程序中对数学、几何及其他轻量的“原子”实体建模。例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。

    3.在表现抽象和多级别的对象层次时,类是最好的选择。

    4.大多数情况下该类型只是一些数据时,结构时最佳的选择。

     

    posted @ 2011-03-01 09:34  黄宝强  阅读(2084)  评论(1编辑  收藏  举报