c#中class和struct

struct 是值类型 ,class是引用类型
struct 不能被继承,也就是说他没有办法搞出子类。
 
http://msdn.microsoft.com/zh-cn/library/0taef578(VS.80).aspx
使用结构(C# 编程指南) 

struct 类型适于表示 Point、Rectangle 和 Color 等轻量对象。尽管可以将一个点表示为类,但在某些情况下,使用结构更有效。例如,如果声明一个 1000 个 Point 对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。由于 .NET Framework 包含名为 Point 的对象,因此我们转而调用结构“CoOrds”。 

public struct CoOrds 
{ 
public int x, y; 

public CoOrds(int p1, int p2) 
{ 
x = p1; 
y = p2; 
} 
} 

声明结构的默认(无参数)构造函数是错误的。总是提供默认构造函数以将结构成员初始化为它们的默认值。在结构中初始化实例字段也是错误的。 

如果使用 new 运算符创建结构对象,则会创建该结构对象,并调用适当的构造函数。与类不同,结构的实例化可以不使用 new 运算符。如果不使用 new,则在初始化所有字段之前,字段都保持未赋值状态且对象不可用。 

对于结构,不像类那样存在继承。一个结构不能从另一个结构或类继承,而且不能作为一个类的基。但是,结构从基类 Object 继承。结构可实现接口,其方式同类完全一样。 

与 C++ 不同,无法使用 struct 关键字声明类。在 C# 中,类与结构在语义上是不同的。结构是值类型,而类是引用类型。有关更多信息,请参见值类型。 

除非需要引用类型语义,否则系统将较小的类作为结构处理效率会更高。

Class可以被实例化,属于引用类型,是分配在内存的堆上的
Struct属于值类型,是分配在内存的栈上的。

==========================================

区别有下面两点:

· struct的实例 所占内存大小是固定的,class实例 所占内存大小是不固定的(因为可以继承);当然,从另一个角度解读就是class是可继承的,而struct是不可以继承的;这是一个硬币的两面;这是它们在存储上的区别,你可以把struct当作阉割后的class。

· struct  默认 是传值,但可以传引用,class则默认传引用,无法传值这是它们在使用上的区别

下面展开说几点:

(1)class也可能分配在栈上(特例)

Int32[] cache = new Int32[100];

cache一个数组,是class,使用 new 关键字,它是分配在堆上的。

Int32* cache = stackalloc Int32[100];

当使用 stackalloc 它就是分配在栈上了。

值类型数组是特例,但这一特例就够了,表明class是可以分配在栈上的。一般的class是无法分配在栈上的,编辑器解释说无法知道size。当然,你也可以认为数组是一个特殊的类型,这个特例不算。实际上,这里的数组已经丢失了class的特征了,你再也无法用数组类去引用它了。如果去除这个特例,则class无法在栈上分配。但是,你也可以这样理解——不是不能,而是不为,微软目前还不想这样干。因为虽然class的size是不确定的,但一个class的实例存在一个最小size,只分配这个最小size的内存即可——C++就这样干的。微软不支持,可能他们认为这样没必要,不必要搞这么复杂。一般来说,能够stackalloc 值类型数组就足够了。

(2)struct也可以分配在堆上

这个无须解释。任何class里面的struct都是分配在堆上的(通过stackalloc分配的数组除外)。有没办法直接分配呢?我试了几分钟,没发现把struct直接分配在托管堆上的方法,但却可以通过Marshal.AllocHGlobal方法分配在非托管堆上。因此,有两种方法可以struct分配在堆上:

(a)设struct是某个class的成员,可将struct分配在托管堆上

(b)使用Marshal或自己写的内存分配器,可将struct分配在非托管堆上

(3)struct也可以传引用

struct默认是传值的,在安全环境下,使用ref关键字可以传引用,在非安全环境下,使用指针可以传引用。

(4)引入struct是为了解决性能问题——小粒度对象的传值比传引用效率高。同时,在非安全代码中,可以使用struct以及指针和非托管资源交互。

posted on 2011-11-06 23:37  MichaelZhao  阅读(795)  评论(0)    收藏  举报

导航