------- Windows Phone 7手机开发、.Net培训、期待与您交流! ------- 结构 在实际生活中,我们经常把一组相关的信息放在一起,比如通讯录的记录。这样便于我们记忆和处理。同样,编程也采纳了这种处理模式。在编程中,把一系列相关的变量组织成为一个单一实体的过程称就为生成结构的过程。这个单一实体的类型就叫做结构类型,每一个变量称为结构的成员。 结构概述 结构和类非常相似。类类型是一种引用类型,它的变量仅仅包含访问某个数据的一个引用(或地址)。但结构是一种值类型,并且不需要堆分配。如果声明一个很大的数组,为了引用每个对象,就需要分配更多的内存。这种情况下,使用结构可以节约资源。 结构声明 结构和类一样,在使用之前需要声明。声明结构需要使用struct关键字. 声明名称为Str的结构。 public struct Str //声明一个名为Str的结构 { } 结构修饰符 和类一样,结构也需要修饰符去限定它。不同的结构,也有不同的访问权限。C#中有多种修饰符来表达结构的不同性质。结构修饰符放在struct关键字的前面,它包括new、public、protected、internal和private共5个关键字。其中,public、protected、internal和private修饰符控制结构的可访问性。 public修饰符:表示该结构是公开的,访问不受限制。 protected修饰符:表示该结构只能是本身或其派生的结构访问。 internal修饰符:表示该结构只能是在当前应用程序中访问。 private修饰符:表示该结构只能是本身访问。 注意:new修饰符可以指定接口隐藏同名的继承成员。 结构成员 结构和类一样,它也包含多种成员,如常量、字段、方法等。 常量:用来表示常数值。 字段:结构的变量。 方法:是包含一系列语句的代码块,通过这些代码块能够实现预先定义的计算或操作。 属性:用于访问对象或结构的特性的成员。 事件:一种使对象或结构能够提供通知的成员。客户端可以通过提供事件处理程序(event handler)为相应的事件添加可执行代码。 索引器:是一种含有参数的属性,又称为含参属性。它提供索引的方式来访问对象,即与数组的访问方式相同。 运算符:定义表达式运算符,通过它可以对该结构的实例进行运算。 实例构造函数:不使用static修饰符,用于实现初始化该结构的实例所需的操作。 静态构造函数:使用static修饰符,用于实现初始化该结构自身所需的操作。 类型:该结构的局部类型。 上述成员除了类型之外,可以分类两大类:数据成员和函数成员。 数据成员包括常量和字段; 函数成员包括方法、属性、事件、索引器、运算符、实例构造函数和静态构造函数。 注意:由于结构的成员和类的成员非常相似 结构和类的区别 结构和类虽然比较相似,但是还存在以下的区别。 区别项 结构 类 类型 值类型 引用类型 在内存中的分配 分配在堆栈上 分配在堆上 默认值 字段本身类型的默认值 字段的默认值为null 无参数的构造函数 不能声明 可以声明 析构函数 不能声明 可以声明 实例字段的初始化 不能 可以 继承 不存在继承,但可以实现接口 存在单继承 实例化时new运算符的使用 可以不使用,对象具有默认初始值 必须使用,且要给每个字段赋初值 继承 在前面我们简单学习了类继承,但是结构不支持继承。因此,在声明结构成员时,不能使用protected或protected internal修饰符。结构类型永远不会是抽象的,并且始终是隐式密封的。因此,结构不能作为其他结构或类的基结构,而且在声明结构时,不能使用abstract或sealed修饰符。 声明名称为Str的结构,它包含两个字段:name和age。其中,在声明age字段时使用了protected修饰符。 public struct Str { string name; protected int age; //错误,不能使用protected修饰符 } 在age的声明处将产生一个编译错误,错误信息为“结构中已声明新的保护成员”。因此,结构成员是不能用protected修饰的。 结构类型隐式地从System.ValueType类继承(System.ValueType类本身继承于object类)。在声明一个结构时,可以指定该结构实现多个接口,但是不能指定基类。 声明一个类和一个结构,它们的名称分别为Program和Str。其中,Str结构继承自Program类。 public class Program //声明Program类 { } public struct Str:Program //错误,Str结构不能声明基类Program或结构不能继承 { string name; //声明name字段 int age; //声明age字段 } 在结构的声明处将产生一个编译错误,错误信息为“接口列表中的类型”Program”不是接口”。因为结构可以实现接口,但是不支持继承,它的函数成员也不能被继承。因此,在声明结构的函数成员时,也不能使用abstract或virtual修饰符。 注意:在结构中,可以使用override修饰符重写从System.ValueType类继承而来的方法。 this保留字 保留字this只能在实例构造函数、实例方法或实例访问器的块中使用,且表示当前实例。在类的构造函数中出现的this作为一个值类型,它表示对正在构造的对象本身的引用。在类的方法中出现的this作为一个值类型,它表示对调用该方法的对象的引用。但是,在结构的构造函数中出现的this作为一个变量类型,它表示对正在构造的结构的引用。在结构的方法中出现的this作为一个变量类型,它表示对调用该方法的结构的引用。 注意:在结构中时,由于this相当于一个变量,因此,可以对this赋值,甚至通过this可能修改其所属结构的值。 构造函数 在类中,可以声明无参数的实例构造函数。但是在结构中,不能声明无参数的实例构造函数。因为每一个结构都隐式地具有一个无参数实例构造函数,该构造函数无法更改。默认的构造函数将初始化该结构所有字段的值。如果字段的类型为值类型,则将该字段的值设置为其类型的默认值。如果字段的类型为引用类型,则将该字段的值设置为null。此外,结构还可以声明带有参数的实例构造函数。 声明名称为Str的结构,它包含两个字段:name和age。Str结构还声明一个带有两个参数(name和age)的实例构造函数,并初始化name和age字段的值。还声明了类Program,Program类定义了一个无参数的构造函数。 public struct Str { string name ; //字段 int age ; public Str(string name, int age) //结构的实例构造函数 { this.name = name; this.age = age; } public void Print() { Console.WriteLine("我叫" +name+",今年"+age+"岁"); } } class program { int i=0; program() //类的构造函数 { i = 10; } static void Main(string[] args) { Str s = new Str("张三", 18); //结构实例化 s.Print(); Program p = new Program(); //类实例化 Console.WriteLine("i = "+p.i); } } ------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------