《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.什么时候使用值类型

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

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

 

小节

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

 

本文转自gyzhao博客园博客,原文链接:http://www.cnblogs.com/IPrograming/archive/2012/12/22/EffectiveCSharp_18.html ,如需转载请自行联系原作者
相关文章
|
存储 开发框架 .NET
"揭秘.NET内存奥秘:从CIL深处窥探值类型与引用类型的生死较量,一场关于速度与空间的激情大戏!"
【8月更文挑战第16天】在.NET框架中,通过CIL(公共中间语言)可以深入了解值类型与引用类型的内存分配机制。值类型如`int`和`double`直接在方法调用堆栈上分配,访问迅速,生命周期随栈帧销毁而结束。引用类型如`string`在托管堆上分配,堆栈上仅存储引用,CLR负责垃圾回收,确保高效且自动化的内存管理。
193 6
|
存储 Java C#
C# 中的值类型与引用类型:内存大小解析
C# 中的值类型与引用类型:内存大小解析
365 2
|
存储 安全 Java
程序与技术分享:C#值类型和引用类型的区别
程序与技术分享:C#值类型和引用类型的区别
284 0
|
存储 C# 图形学
代码解析 C# 引用类型还是值类型
代码解析 C# 引用类型还是值类型
246 0
|
存储 C# C语言
C# OOP之五 深入理解值类型和引用类型
C# OOP之五 深入理解值类型和引用类型
151 0
|
存储 Java C#
C# 中的值类型与引用类型
在 C# 编程中,值类型和引用类型的区别至关重要,直接影响内存管理、性能优化及编程模式选择。值类型直接存储数据(如 `int`、`float`),而引用类型存储数据的引用地址(如 `class`、`string`)。值类型的赋值涉及数据复制,适合小数据量;引用类型仅复制引用,适合大数据量处理但需关注垃圾回收。本文通过具体代码示例详细解析二者的定义、存储方式及性能影响,并提供实战案例分析及易错点避免方法,帮助读者更好地理解和应用。
357 2
|
安全 编译器 C#
C#中的可空引用类型:减少空引用异常的利器
【1月更文挑战第9天】C# 8.0中引入的可空引用类型特性,它通过在编译时提供更精确的静态分析,帮助开发者减少运行时的空引用异常。文章详细阐述了可空引用类型的工作原理、如何配置项目以使用此特性,以及在实际编码中如何利用可空引用类型提升代码的健壮性和可读性。
|
存储 C#
C# “值类型“和“引用类型“在内存的分配
C# “值类型“和“引用类型“在内存的分配
C#由Dictionary赋值引发的对引用类型使用的思考
C#由Dictionary赋值引发的对引用类型使用的思考