当前位置:主页   - 电脑 - 程序设计 - C#
Effective C# 原则6:区别值类型数据和引用类型数据
来源:网络   作者:   更新时间:2012-03-21
收藏此页】    【字号    】    【打印】    【关闭

  值类型数据还是引用类型数据?结构还是类?什么你须要使用它们呢?这不是C++,你可以把所有类型都定义为值类型,并为它们做一个引用。这也不是Java,所有的类型都是值类型。你在创建每个类型实例时,你必须决定它们以什么样的形式存在。这是一个为了取得正确结果,必须在一开始就要面对的重要决定。(一但做也决定)你就必须一直面对这个决定给你带来的后果,因为想在后面再对它进行改动,你就不得不在很多细小的地方强行添加很多代码。当你设计一个类型时,选择struct或者class是件简单的小事情,但是,一但你的类型发生了改变,对所有使用了该类型的用户进行更新却要付出(比设计时)多得多的工作。

  这不是一个简单的非此及彼的选择。正确的选择取决于你希望你的新类型该如何使用。值类型不具备多态性,但它们在你的应用程序对数据的存取却是性能有佳;引用类型可以有多态性,并且你还可以在你的应用程序中为它们定义一些表现行为。考虑你期望给你的类型设计什么样的职能,并根据这些职能来决定设计什么样的类型。结构存储数据,而类表现行为。

  因为很多的常见问题在C++以及Javaj里存在,因此.Net和C#对值类型和引用类型的做了区分。在C++里,所有的参数和返回值都是以值类型的进行传递的。以值类型进行传递是件很有效率的事,但不得不承受这样的问题:对象的浅拷贝(partial copying)(有时也称为slicing object)。如果你对一个派生的对象COPY数据时,是以基类的形式进行COPY的,那么只有基类的部分数据进行了COPY。你就直接丢失了派生对象的所有信息。即使时使用基类的虚函数。

  而Java语言呢,在放弃了值类型数据后,或多或少有些表现吧。Javs里,所有的用户定义类型都是引用类型,所有的参数及返回数据都是以引用类型进行传递的。这一策略在(数据)一致性上有它的优势,但在性能上却有缺陷。让我们面对这样的情况,有些类型不是多态性的--它们并不须要。Java的程序员们为所有的变量准备了一个内存堆分配器和一个最终的垃圾回收器。他们还须要为每个引用变量的访问花上额外的时间,因为所有的变量都是引用类型。在C#里,你或者用struct声明一个值类型数据,或者用class声明一个引用类型数据。值类型数据应该比较小,是轻量级的。引用类型是从你的类继承来的。这一节将练习用不同的方法来使用一个数据类型,以便你给掌握值类型数据和引用类型数据之间的区别。

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明