《Effective C#》读书笔记——条目18:区分值类型和引用类型<.NET资源管理>

  C#和JAVA不同,在C#中可以创建值类型,而在Java中创建的所有类型都是引用类型。在使用C#开发时,选择值类型还是引用类型对我们的程序的行为会产生很大的影响,所以我们需要对值类型和引用类型的使用场景进行了解和对二者的不同进行区分。

 

1.引入引用类型和值类型的原因  

  C#之所以添加了值类型和引用类型的区别是由于:C++和Java中普遍存在的问题,在C++中,所有的参数和返回值都是通过值类传递。传值非常高效,不过却会带来部分复制(partial copying)的问题:即当在需要基类的地方传入了一个派生类,那么只有属于基类的部分才会被复制过去,派生类部分所有的信息,全部丢失;而在Java中所有的参数和返回值都是以引用的形式传递的,这种方式的优点在于其一致性,性能却会受到影响。所以C#为了避免这些,可以通过class关键字和struct关键字分别创建引用类型和值类型。

 

2.值类型和引用类型的区别

  在使用C#创建一个类时我们可以选择使用struct或class关键字分别创建值类型和引用类型,在使用引用类型和值类型之前,我们应该知道二者有和区别:

值类型无法实现多态,适合用来存放数据。引用类型支持多态,适合用来定义程序的行为。

值类型应该是小型、轻量级别的类型,引用类型则用来构成类层次结构

 

3.什么时候使用值类型

 在大多数情况下,我们创建的类型都是属于引用类型,如果你创建的类型符合以下条件,那么才应该使用值类型:

  • 该类型的主要职责是用于数据存储
  • 该类型的公有接口都是由访问其数据成员的属性定义的
  • 该类型永远也不会有派生类
  • 该类型永远不需要多态支持

 

小节

   使用值类型表示底层存储数据的类型,用引用类型来封装程序的行为。这样可以保证类暴露出的数据能以复制的形式安全提供,也能够得到基于栈存储和使用内联方式存储带来的内存性能提升,更可以使用标准的面向对象技术来表达应用程序的逻辑。如果对类的用途并不确定,那就应该使用引用类型。

 

posted @ 2012-12-22 10:48  gyzhao  阅读(1196)  评论(1编辑  收藏  举报