类与结构

来源:互联网 发布:linux mysql登录命令 编辑:程序博客网 时间:2024/04/30 09:35

一、结构体和类相似之处:

1,定义和使用非常相似,例子如下:

public struct Student{    string Name;    int Age;}
public class Question{    int Number;    string Content;}

使用:

Student s=new Student();Question q=new Question();

2,两者都是container类型,可以包含其他数据类型作为成员。
包括:构造函数、方法、属性、字段、常量、枚举类型、事件、以及事件处理函数。两者的成员都有其各自的存取范围。例如,可以将某一个成员声明为Public,而将另一个成员声明为Private。
两者都可以实现接口。都可以公开一个默认属性,然而前提是这个属性至少要取得一个自变量。都可以声明和触发事件,而且两者都可以声明委托(Delegate)。

二、结构体和类的主要区别

1,结构是实值类型(Value Types)使用栈存储(Stack Allocation),而类则是引用类型(Reference Types)使用堆存储(Heap Allocation)。

2,结构成员不能被声明位Protected,而类成员可以。

3,结构变量声明不能指定初始值、使用New关键字货对数组进行初始化,但是类变量声明可以。

4,结构不能声明默认的构造函数,也就是不拥有参数的非共享构造函数,但是类则无此限制。

5,二者都可以拥有共享构造函数,结构的共享构造函数不能带有参数,但是类的共享构造函数则可以带或者不带参数。结构只能在一种情况下使用非共享构造函数,那就是非共享构造函数会接受参数。但是类则无此限制,它可以使用带参数或不带参数的非共享构造函数。

6,结构不允许声明析构函数(Destructor),类则无此限制。结构永远不会终止,因此CLR不会在任何结构上调用Finalize方法。类则是由内存回收进程加以终止,当内存回收进程检测到没有任何作用的类时,它就会调用类的Finalize方法。

7,结构的实例(Instance)声明,不允许对包含的变量进行初始化设定,类则可以在声明类的实例时,同时进行变量初始化。

8,结构是隐式继承自ValueType类,而且不能继承任何其他类型,类则可以继续自ValueType以外的任何类。

9,结构是无法被继承的,类则可以。

10,结构不需要构造函数,类则需要构造函数。

11,每一个结构都具有无参数的隐含公共构造函数,此构造函数会将结构的所有成员初始化为其默认值。不需要重新定义这个行为。

12 ,在“实例和变量”层面上,由于结构是数值类型的,因此每一个结构变量会永远的绑定到结构实例上。然而类是引用类型的,而且对象变量可引用不同的类实例,在此方面的区别,会对使用将结构和类造成如下的影响:

(1),结构变量会隐式的使用结构的无参数构造函数来初始化成员,这就意味语句 Struct S = new Struct()。

(2),当您将一个结构变量赋值给另一个,或者将结构实例传递到程序变量时,所有变量成员的值会复制到新的结构中。当您将一个对象变量赋值给另一个,或者将对象变量传递给程序时,则只是复制指针。

(3),您可以将Null值赋值给结构变量,但是该实例会一直与该变量保持关联。虽然变量成员会因此赋值而重新初始化,但是您还是可以调用变量的方法并访问其数据成员。相反的,如果您将对象变量设定为Null,您就会中断它与任何类型实例的关联,而且除非您再将另一个实例赋值给它,否则无法通过变量访问任何成员。

(4),您可以在不同时间将不同的类的实例赋值给同一个对象变量,而且在同一时间可有好几个对象变量引用相同的类实例,如果您对类成员值做了改变,则其他指向相同实例的对象变量也会发生改变。然而,结构成员则会封装在他们自己的实例中,变更结构成员值并不会对其他任何结构变量的成员造成影响,甚至也不会影响相同结构声明的其他实例。

(5),两个结构必须以成员对成员的比较方式来执行相等比较。两个对象变量可以使用Equals方法来加以比较。Equals会判断两个变量是否指向相同的实例。

13,类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体不具备类的继承多态特性
14,构造函数是为了初始化类的字段而存在的,而结构体并不需要初始化就能使用,因此,结构体中并不存在默认的构造函数。

小结:

结构:
没有默认的构造函数,但是可以添加构造函数
没有析构函数
没有 abstract 和 sealed(因为不能继承)
不能有protected 修饰符
可以不使用new 初始化(结构的是值类型 存储在栈中,值类型的变量即包括变量地址和变量内容所以可以直接像int ,double ..等使用,不要需要new 使用new 只是说可以方便一点初始化字段,但需要自己添加构造函数。)
在结构中初始化实例字段是错误的

类:
有默认的构造函数
有析构函数
可以使用 abstract 和 sealed
有protected 修饰符
必须使用new 初始化

三.如何选择结构还是类

1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
2. 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
3,class完全可以替代struct能实现的所有功能,但,对于一些相对小的数据结构,应该考虑使用struct。

0 0
原创粉丝点击