《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 ,如需转载请自行联系原作者
相关文章
|
7月前
|
存储 C# C语言
C# OOP之五 深入理解值类型和引用类型
C# OOP之五 深入理解值类型和引用类型
27 0
|
3月前
|
安全 编译器 C#
C#中的可空引用类型:减少空引用异常的利器
【1月更文挑战第9天】C# 8.0中引入的可空引用类型特性,它通过在编译时提供更精确的静态分析,帮助开发者减少运行时的空引用异常。文章详细阐述了可空引用类型的工作原理、如何配置项目以使用此特性,以及在实际编码中如何利用可空引用类型提升代码的健壮性和可读性。
|
8月前
|
存储 C# 图形学
代码解析 C# 引用类型还是值类型
代码解析 C# 引用类型还是值类型
|
4月前
|
存储 C#
C# “值类型“和“引用类型“在内存的分配
C# “值类型“和“引用类型“在内存的分配
|
7月前
|
C#
C#由Dictionary赋值引发的对引用类型使用的思考
C#由Dictionary赋值引发的对引用类型使用的思考
|
7月前
.NET Core配置强类型绑定及配置热更新能力
学习了配置框架的4种配置方式之后,我们可以对不同的环境选择不同的配置方式,以使服务能够更好的适应各种环境,那么,你是否觉得配置虽然加载进服务中,但是使用起来却不是很方便,每次读取都得通过对应的键值去根查找,是否想过如果我们修改了配置文件呢?本篇,我们一起来学习下这两个问题。为了方便演示,本节使用文件提供程序配置方式。
|
9月前
|
数据库 C#
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
219 0
|
10月前
|
存储 程序员 编译器
【Effective C++详细总结】第三章 资源管理
【Effective C++详细总结】第三章 资源管理
231 0
|
开发框架 前端开发 JavaScript
.NET Core Web API使用HttpClient提交文件的二进制流(multipart/form-data内容类型)
.NET Core Web API使用HttpClient提交文件的二进制流(multipart/form-data内容类型)
335 0
.NET Core Web API使用HttpClient提交文件的二进制流(multipart/form-data内容类型)
|
安全 编译器 C#
30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法
30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法
85 0
30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法