C#中类和结构体的异同?

 我来答
mathewxiang
2010-11-28 · 超过36用户采纳过TA的回答
知道答主
回答量:186
采纳率:0%
帮助的人:114万
展开全部
类应该说只是一个逻辑上的集合,而结构体就是你自己创造的一个对象,可以有自己的属性和方法等。

http://www.cftea.com/c/2008/03/JHB3MJM8DYGS0JJ9.asp
迟蕴0KBeb4
2010-11-28 · TA获得超过2396个赞
知道小有建树答主
回答量:670
采纳率:0%
帮助的人:383万
展开全部
类(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以及指针和非托管资源交互。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式