Effective C#原则6:区别值类型数据和引用类型数据

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

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

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

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

我 们开始了,这有一个从一个方法上返回的类型:

private MyData _myData;
public MyData Foo()
{
return _myData;
}
// call it:
MyData v = Foo();
TotalSum += v.Value;

如果MyData是一个值类型,那么回返值会被COPY到V中 存起来。而且v是在栈内存上的。然而,如果MyData是一个引用类型,你就已经 把一个引用导入到了一个内部变量上。同时,

你也违犯了封装原则(见原 则23)。

或者,考虑这个变量:

private MyData _myData;
public MyData Foo()
{
return _myData.Clone( ) as MyData;
}
// call it:
MyData v = Foo();
TotalSum += v.Value;

时间: 2024-08-02 01:55:11

Effective C#原则6:区别值类型数据和引用类型数据的相关文章

Effective C#原则33:限制类型的访问

并不是所有的人都须要知道所有的事.也不是所有的类型须要是公共的.对于每个类型,在满足功能的情况下,应该尽可能的限制访问级别.而且这些访问级别往往比你想像的要少得多.在一个私有类型上,所有的用户都可以通过一个公共的接口来访问这个接口所定义的功能. 让我们回到最根本的情况上来:强大的工具和懒惰的开发人员.VS.net对于他们来说是一个伟大的高产工具.我用VS.net或者C# Builder轻松的开发我所有的项目,因为它让我更快的完成任务.其中一个加强的高产工具就是让你只用点两下按钮,一个类就创建了,

Swift里的值类型与引用类型区别和使用_Swift

Swift里面的类型分为两种: ●值类型(Value Types):每个实例都保留了一分独有的数据拷贝,一般以结构体 (struct).枚举(enum) 或者元组(tuple)的形式出现. ●引用类型(Reference Type):每个实例共享同一份数据来源,一般以类(class)的形式出现. 在这篇博文里面,我们会介绍两种类型各自的优点,以及应该怎么选择使用. 值类型与引用类型的区别 值类型和引用类型最基本的分别在复制之后的结果.当一个值类型被复制的时候,相当于创造了一个完全独立的实例,这个

值类型与引用类型(中)

本文将介绍以下内容: 类型的基本概念  值类型深入 引用类型深入 值类型与引用类型的比较及应用    1. 引言 上回[第八回:品味类型---值类型与引用类型(上)-内存有理]的发布,受到大家的不少关注,我们从内存的角度了解了值类型和引用类型的所以然,留下的任务当然是如何应用类型的不同特点在系统设计.性能优化等方面发挥其作用.因此,本回是对上回有力的补充,同时应朋友的希望,我们尽力从内存调试的角度来着眼一些设计的分析,这样就有助于对这一主题进行透彻和全面的理解,当然这也是下一回的重点. 从内存角

Swift 值类型和引用类型

原文地址:https://developer.apple.com/swift/blog/?id=10 Swift中的类型分为两类:一,值类型(value types),每个值类型的实例都拥有各自唯一的数据,通常它们是结构体,枚举或元组:二,引用类型(reference types),引用类型的实例共享它们的数据,通常是一个类.在这篇文章中我们将会探索值类型和引用类型的价值,以及如何在它们二者间抉择. 有什么区别? 值类型最基本的特征就是复制在赋值.初始化和传递参数过程中的数据,并为这个数据创建一

C# 引用类型、值类型

CLR支持两种类型:引用类型和值类型,它们的区别是在内存分配方式上的差异:引用类型是从托管堆上分配的:值类型是在线程栈上分配的.而CLR的垃圾回收是针对托管堆的,因此值类型不受垃圾回收器的控制. 在FCL中,所有称为"结构"(struct)的类型都是值类型,所有称为"类"(class)的类型都是引用类型.所有的Struct都直接派生自抽象类System.ValueType,而System.ValueType直接从System.Object派生.所有的枚举都直接从Sy

[你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途

本文将介绍以下内容: 类型的基本概念 值类型深入 引用类型深入 值类型与引用类型的比较及应用 1.引言 值类型与引用类型的话题经过了两个回合([第八回:品味类型---值类型与引用类型(上)-内存有理]和[第九回:品味类型---值类型与引用类型(中)-规则无边])的讨论和切磋,我们就基本的理解层面来说已经差不多了,但是对这一部分的进一步把握和更深刻的理解还要继续和深化,因为我自己就在两篇发布之际,我就得到装配脑袋兄的不倦指导,之后又查阅了很多的资料发现类型在.NET或者说语言基础中何其重要的内涵和

值类型与引用类型(下)

本文将介绍以下内容: 类型的基本概念  值类型深入 引用类型深入 值类型与引用类型的比较及应用 [下载]:[类型示例代码]   1. 引言 值类型与引用类型的话题经过了两个回合([第八回:品味类型---值类型与引用类型(上)-内存有理]和[第九回:品味类型---值类型与引用类型(中)-规则无边])的讨论和切磋,我们就基本的理解层面来说已经差不多了,但是对这一部分的进一步把握和更深刻的理解还要继续和深化,因为我自己就在两篇发布之际,我就得到装配脑袋兄的不倦指导,之后又查阅了很多的资料发现类型在.N

asp.net c# 值类型与引用类型详细说明

asp教程.net c# 值类型与引用类型详细说明 c# 中的类型有两种:值类型 (value type) 和引用类型 (reference type). 值类型的变量直接包含它们的数据,而引用类型的变量存储对它们的数据的引用,后者称为对象. 对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象. 对于值类型,每个变量都有它们自己的数据副本(除 ref 和 out 参数变量外),因此对一个变量的操作不可能影响另一个变量. c# 的值类型进一步划分为简单类型

浅谈C#中的值类型和引用类型_C#教程

一.基本概念 C#只有两种数据类型:值类型和引用类型 值类型在线程栈分配空间,引用类型在托管堆分配空间 值类型转为引用类型称成为装箱,引用类型转为值类型称为拆箱 以下是值类型和引用类型对照表 从上图可以简单看出:string,Object,数组,class是引用类型,简单类型,枚举,结构是值类型. 二.代码展示 定义一个类和结构调用赋值 内存分配情况如下图: 从这张图可以看出,class实例化出来的对象,指向了内存堆中分配的空间:truct实例化出来的对象,是在内存栈中分配. 修改代码如下: 内