[你必须知道的.NET] 第四回:后来居上:class和struct
<div class="posthead"> ?
? 1.?引言 提起class和struct,我们首先的感觉是语法几乎相同,待遇却翻天复地。历史将接力棒由面向过程编程传到面向对象编程,class和struct也背负着各自的命运前行。在我认为,struct英雄迟暮,class天下独行,最本质的区别是class是引用类型,而struct是值类型,它们在内存中的分配情况有所区别。由此产生的一系列差异性,本文将做以全面讨论。? 2. 基本概念 2.1. 什么是class? class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段、属性、方法、属性、构造函数、索引器、操作符等。因为是基本的概念,所以不必在此详细描述,读者可以查询相关概念了解。我们重点强调的是.NET中,所有的类都最终继承自System.Object类,因此是一种引用类型,也就是说,new一个类的实例时,对象保存了该实例实际数据的引用地址,而对象的值保存在托管堆(managed heap)中。? 2.2. 什么是struct? struct(结构)是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体?。所有的结构都继承自System.ValueType类,因此是一种值类型,也就是说,struct实例分配在线程的堆栈(stack)上,它本身存储了值,而不包含指向该值的指针。所以在使用struct时,我们可以将其当作int、char这样的基本类型类对待。
3. 相同点,不同点
相同点:语法类似。 不同点:
我们可以简单的理解,class是一个可以动的机器,有行为,有多态,有继承;而struct就是个零件箱,组合了不同结构的零件。其实,class和struct最本质的区别就在于class是引用类型,内存分配于托管堆;而struct是值类型,内存分配于线程的堆栈上。由此差异,导致了上述所有的不同点,所以只有深刻的理解内存分配的相关内容,才能更好的驾驭。本系列将再以后的内容中,将引用类型和值类型做以深入的比较和探讨,敬请关注。当然正如本文标题描述的一样,使用class基本可以替代struct的任何场合,class后来居上。虽然在某些方面struct有性能方面的优势,但是在面向对象编程里,基本是class横行的天下。 那么,有人不免会提出,既然class几乎可以完全替代struct来实现所有的功能,那么struct还有存在的必要吗?答案是,至少在以下情况下,鉴于性能上的考虑,我们应该考虑使用struct来代替class:
所有这些是struct有一席之地的理由,当然也许还有其他的更多说法,只是我不知道罢了:-) 4. 经典示例 4.1 小菜一碟 下面以示例为说明,来阐述本文的基本规则,详细见注释内容。(1)定义接口 (2)定义类 (3)定义结构 (4)测试结构和类 猜猜运行结果如何,可以顺便检查检查对这个概念的认识。 4.2?.NET研究 在.NET?框架中,System.Drawing命名空间中的有些元素,如System.Drawing.Point就是实现为struct,而不是class。其原因也正在于以上介绍的各方面的权衡,大家可以就此研究研究,可以体会更多。另外,还有以struct实现的System.Guid。 5. 结论 对基本概念的把握,是我们进行技术深入探索的必经之路,本系列的主旨也是能够从基本框架中,提供给大家一个通向高级技术的必修课程。本文关于class和struct的讨论就是如此,在.NET框架中,关于class和struct的讨论将涉及到对引用类型和值类型的认识,并且进一步将触角伸向变量内存分配这一高级主题,所以我们有必要来了解其运行机制,把握区别和应用场合,以便在平常的系统设计中把握好对这一概念层次的把握。 另外,请大家就以下问题进行讨论,希望能够更加清晰本文的拓展:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – DotNetOpenAuth在ASP.NET MVC中的OAuth
- asp.net-mvc – MVC中TextBoxFor的DisplayFormat
- 清除ASP.net窗体中的所有字段
- asp.net-mvc-3 – 是否需要StructureMap HttpContextScoped
- asp.net – odbc连接的连接字符串是什么?
- asp.net-mvc – 为服务层设计DI(构造函数注入)的存储库
- MVC学习一:EF
- asp.net – 如何使用angular2的http与应用程序主机端口之外
- asp.net – 如何格式化C#代码并将其转换为HTML
- asp.net-mvc – 使用WCF IOC Structuremap的SOA架构
- asp.net – SharePoint文件大小限制
- asp.net-mvc – 自定义EditorTemplate可以为其中
- asp.net-mvc – 如何将OpenId与ASP.Net成员集成在
- asp.net – 是否可以将对象传递给前端的usercont
- 在Asp.net Gridview中显示多列中的行
- 我可以这样修改ASP.NET会话对象吗?
- 如何使用Feature Toggle Nuget Package在.Net Co
- asp.net-mvc-4 – MVC4 StyleBundle不以正确的顺
- asp.net – Visual Studio 2010图表控件 – 线条
- Asp.Net MVC自定义控件 – 容器