《框架设计 CLR Via C# (第2版)》 - 学习笔记

本文是《框架设计 CLR Via C# (第2版)》的学习笔记,详细介绍了.NET Framework 的设计理念、核心组件及编程模型。书中涵盖类型系统、内存管理、安全、异常处理、线程和多线程、应用程序域、反射、委托、事件、泛型等多个关键主题,深入探讨了C#语言特性和底层机制,帮助开发者理解并优化.NET代码。
摘要由CSDN通过智能技术生成

《框架设计 CLR Via C#》 (第2版)

========== ========== ==========
[作者] (美) Jeffrey Richter
[译者] (中) 周靖 张杰良
[出版] 清华大学出版社
[版次] 2006年11月 第1版
[印次] 2007年02月 第2次 印刷
[定价] 68.00元
========== ========== ==========

【前言】 

Microsoft .NET Framework 的目标不是为构建一种特定类型的应用程序的开发人员提供一个抽象技术。相反,它的目标是为平台或者 Microsoft Windows 操作系统本身提供一个抽象技术。

.NET Framework 为所有类型的应用程序提升了抽象等级。这意味着开发人员只需学习和掌握一个编程模型和一套 API (应用程序编程接口) ,不管开发人员是用它们来构建控制台应用程序、图形应用程序、网站,还是构建由其他应用程序使用的组件。

【第01章】 

(P011) 

一个方法只有在首次调用时才会造成一定的性能损失。以后对该方法的所有调用都以本地代码的形式全速运行,因为不需要再次执行验证和编译成本地代码。

【第02章】 

(P039) 

程序集是进行重用、版本控制和安全保护的一个基本单元。它允许我们将类型和资源文件划分到单独的文件中。

(P047) 

在 Visual Studio 中新建一个 C# 项目时,会自动创建一个 AssemblyInfo.cs 文件。

(P051) 

配置文件包含的是 XML 代码,可以和一个应用程序关联到一起,或者和机器关联到一起。由于使用的不是注册表设置,而是一个单独的文件,所以文件能够方便地进行备份,管理员也能将应用程序方便地复制到另一台机器 —— 只需复制必要的文件,就能顺便复制管理策略。

(P052) 

对于可执行应用程序 (EXE) 来说,配置文件必须在应用程序的基目录中,而且必须采用 EXE 文件的全名作为文件名,再附加一个 .config 扩展名。

对于 Microsoft ASP.NET Web 窗体应用程序,文件必须在 Web 应用程序的虚构根目录中,而且总是命名为 Web.config 。除此之外,子目录也可以包含它们自己的 Web.config 文件,而且配置设置会得以继承。

【第03章】 

(P062) 

不能将一个弱命名的程序集放到 GAC 中。

建议编程人员尽量避免全局部署,尽量使用私有部署。

【第04章】 

(P083) 

C# 不需要任何特殊语法即可将一个对象强制转换成它的任何基类型,因为向基类型的转换被认为是一种安全的隐式转换。

C# 要求开发人员将一个对象显式转换成它的任何派生类型,因为这样的转型可能在运行时失败。

(P084) 

类型伪装是造成许多安全漏洞的根源,并会破坏应用程序的稳定性和可靠性。因此,类型安全性是 CLR 的一个极其重要的目标。

在 C# 语言中进行强制类型转换的另一种方式是使用 is 操作符。 is 操作符检查一个对象是否兼容于指定的类型,并返回一个 Boolean 值 : true 或 false 。注意 is 操作符永远不会抛出异常。

(P085) 

假如对象引用为 null ,那么 is 操作符总是返回 false ,因为无可用的对象来检查其类型。

as 操作符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常 —— 相反,如果对象不能转型,结果就是 null 。所以,正确的做法是检查最终生成的引用是否为 null 。如果企图直接使用最终生成的引用,会造成一个 System.NullReferenceException 异常。

(P089) 

事实上, .NET Framework 甚至根本没有发布一个 System.IO.dll 程序集。

【第05章】 

(P098) 

编译器直接支持的任何数据类型都称为基元类型 (primitive type) 。基元类型直接映射到 Framework 类库 (FCL) 中存在的类型。

(P101) 

C# 总是对结果进行截断处理,而不进行舍入。

(P104) 

值类型的实例通常是在一个线程的堆栈上分配的 (虽然它们也可以嵌入一个引用类型对象中) 。

在代表值类型实例的一个变量中,并不包含一个指向实例的指针。相反,变量中包含了实例本身的字段。

由于变量已经包含实例的字段,所以在对实例的字段进行处理时,不再需要提领一个指针。

值类型的实例不受垃圾收集器的制约。因此,它们的使用缓解了托管堆上的压力,并减少了一个应用程序在其生存期内需要进行的垃圾收集次数。

所有值类型都是密封 (sealed) 类型,目的是防止将一个值类型用作其他任何引用类型或值类型的基类型。

(P105) 

在 C# 中,使用 struct 声明的类型是值类型,使用 class 声明的类型是引用类型。

(P106) 

值类型对象有两种表示形式 : 未装箱 (unboxed) 形式和已装箱 (boxed) 形式,而引用类型总是处于已装箱形式。

引用类型的变量包含堆中的对象的地址,默认情况下,在创建一个引用类型的变量时,它被初始化为 null ,表明引用类型变量当前并不指向一个有效的对象。

试图使用一个 null 引用类型变量,会抛出一个 NullReferenceException 异常。

相反,值类型的变量总是包含其基础类型的一个值,而且值类型的所有成员都初始化为 0 。由于值类型变量不是指针,所以在访问一个值类型时,不可能抛出一个 NullReferenceException 异常。

(P107) 

将一个值类型的变量赋给另一个值类型变量时,会执行一次逐字段的复制。将引用类型的变量赋给另一个引用类型的变量时,只复制内存地址。

值类型的变量是自成一体的对象,对一个值类型变量执行的操作不可能影响另一个值类型变量。

(P109) 

为了将一个值类型转换成一个引用类型,可以使用一个名为 “装箱” (boxing) 的机制。下面总结了对一个值类型的实例进行装箱操作时在内部发生的事情 : 

1. 从托管堆中分配好内存。分配的内存量是值类型的各个字段所需要的内存量加上托管堆上的所有对象都有的两个额外成员 (即类型对象指针和同步块索引) 所需要的内存量;

2. 值类型的字段复制到新分配的堆内存;

3. 返回对象的地址。现在,这个地址是对一个对象的引用,值类型现在是一个引用类型;

(P110) 

拆箱其实就是获取一个指针的过程,该指针指向包含在一个对象中的原始值类型 (数据字段) 。事实上,指针指向的是已装箱实例中的未装箱部分。

在对一个对象进行拆箱操作时候,只能将其转型为未装箱时的值类型。

(P115) 

调用一个方法时,假如它没有为传给它的一种特定的值类型准备一个重载版本,那么最终肯定会调用接受一个 Object 参数的重载版本。将一个值类型实例作为一个 Object 来传递,会造成装箱操作的发生,从而对性能产生不利影响。

未装箱的值类型是比引用类型更为 “轻型” 的类型。这要归究于以下两个原因 : 

1. 它们不在托管堆上分配;</

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值