C#中的结构和枚举

来源:互联网 发布:淘宝网手机库计算比例 编辑:程序博客网 时间:2024/06/06 14:16

原文地址:http://www.dingos.cn/index.php?topic=869.0

【枚举】
枚举是一个指定的常数,其基础类型可以是除 Char 外的任何整型。如果没有显式声明基础类型,则使用 Int32。编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举。
枚举 (enum) 是值类型的一种特殊形式,它从 System.Enum 继承而来,并为基础的基元类型的值提供替代名称。枚举类型有名称、基础类型和一组字段。基础类型必须是一个内置的有符号(或无符号)整数类型(如 Byte、Int32 或 UInt64)。
C# 允许您使用 enum 关键字创建自己的命名常量集。使用这些数据类型可以声明一组名称或其他文本值,用于定义可以赋给某个变量的所有可能值。
public enum DayOfWeek{
    Sunday = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6
}

class Program{
    static void Main() {
        DayOfWeek day = DayOfWeek.Monday;
        int i = (int) DayOfWeek.Monday;

        System.Console.WriteLine(day);  // displays Monday
        System.Console.WriteLine(i);    // displays 1
    }
}

【enum 数据类型的常用功能】
显示枚举的文本值
如果需要访问在 enum 数据类型中使用的名称或词,则可以使用 ToString() 方法来实现
DayOfWeek day = DayOfWeek.Wednesday;
System.Console.WriteLine(day.ToString());  // displays Wednesday

设置默认值
默认情况下,枚举类型中的第一个值为零。可以指定其他初始值,如下所示:
enum Color { Red = 1, Yellow = 2, Blue = 3 };

实际上,所有值都可以定义唯一的整数值:
enum Medal { Gold = 30, Silver = 20, Bronze = 10 };

获取枚举的整型值
int i = (int) DayOfWeek.Monday;

从一个字符串中获取枚举值
DayOfWeek day = (DayOfWeek)(Enum.Parse(typeof(DayOfWeek), "Monday"));

【结构】
C# 中的结构与类相似,但结构缺乏某些功能,例如继承。另外,由于结构是一个值类型,因此通常创建结构要比创建类的速度快。如果您有一些紧凑循环,需要在其中创建大量新数据结构,则应考虑使用结构而不是类。

结构是使用 struct 关键字定义的,例如:
public struct PostalAddress{
    // Fields, properties, methods and events go here...
}

结构与类共享大多数相同的语法,但结构比类受到的限制更多:
  • 在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。
  • 结构不能声明默认构造函数(没有参数的构造函数)或析构函数。

由于结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值来实现默认构造函数。结构不能从类或其他结构继承。
结构是值类型。如果从结构创建一个对象并将该对象赋给某个变量,则该变量包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。由于结构不使用引用,因此结构没有标识;无法区分具有相同数据的两个值类型实例。C# 中的所有值类型都继承自 ValueType,后者继承自 Object。
结构还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型,但如果同时需要上述几种成员,则应当考虑改为使用类作为类型。
结构可以实现接口,但它们无法继承另一个结构。因此,结构成员无法声明为 protected。

结构的特点:
  • 结构是值类型,而类是引用类型。
  • 与类不同,结构的实例化可以不使用 new 运算符。
  • 结构可以声明构造函数,但它们必须带参数。
  • 一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
  • 结构可以实现接口。
  • 结构可用作可为 null 的类型,因而可向其赋 null 值。

【结构与类的区别】
  • 相同点:
    都可以包含字段、方法
    都可以实现接口
  • 不同点:
    类:
    • 引用类型
    • 可以被继承
    • 可以有默认构造函数
    • 可以添加无参的构造函数
    • 创建对象时必须使用new
    • 类中可以给字段赋值
    结构:
    • 值类型
    • 不能被继承
    • 不可以有默认构造函数
    • 可以添加构造函数,但它们必须带参数
    • 创建对象可以不用new
    • 结构中给字段赋值是错误的