C#权威指南读书笔记——001

来源:互联网 发布:淘宝上的皮鞋 编辑:程序博客网 时间:2024/06/12 01:37

Int32 BirthdayNumber = 1023;        // CTS Int32型变量 BirthdayNumberObject BoxingBirthdayNumber = BirthdayNumber;   // 系统会自动装箱Int32 UnBoxingBirthdayNumber = (Int32)BoxingBirthdayNumber;  // 明确拆箱类型后拆箱

《C#权威指南》

书号:9787111321873

这本书一共分为三个部分:

第一部分:.NET体系结构

第二部分:语法

第三部分:Visual Studio 开发环境与C#编码规范

我按照第一部分、第三部分、第二部分的顺序进行阅读。读此书需要有一定编程基础。

第1章:.NET体系结构

C#是一门独立的语言,但是和Java一样,编译、运行需要依赖.NET基类库。

.NET是微软继Windows DNA(Windows Distributed interNet Applications,.NET的前身)之后一个全新的、集成的、面向对象的开发平台。它以CLR(通用语言运行时)为基础,支持C#、F#、VB.NET等等。版本自2000年1.0版本以来到2010年已经更新到4.0版本,对应年份有对应的Visual Studio版本(如Visual Studio 2010)。

.NET框架是运行在操作系统之上、应用程序之下的一个抽象层,它本身是跨平台的,微软提供了一个基于Windows的.NET实现,其他开源团体提供了基于非Windows平台的.NET实现,如Mono。

.NET可以看作是一种虚拟机,它为.NET应用程序提供编译、运行、内存管理、垃圾收集、安全等服务。也就是说,.NET应用程序不需要与操作系统打交道,它直接与.NET框架打交道。所以,只要相应平台实现了.NET,这个程序便能跨平台运行。.NET会自动管理内存的申请释放,然而它的代价是一定的性能损失。

.NET框架由两个部分组成:公共语言运行时(CLR,Common Language Runtime)与.NET框架类库。

在.NET平台上运行的代码分为两种,一种是托管代码,它在CLR的监视下运行。另一种是非托管代码,如直接调用Wiin32 API的代码。托管代码与非托管代码之间可以相互调用。.NET类库中并不是所有代码都是由纯粹托管代码编写的,也有类是对Win32API的封装,如ProtectedData。

.NET与JVM实际上是类似的。

通用语言基础架构(CLI,Common Language Infrastructure)是.一种规范,CLI为IL代码提供运行的环境,你可以将使用任何语言编写的代码通过其特定的编译器转换为MSIL代码之后运行其上,甚至还可以自己写MSIL代码在CLI上面运行。

CLI旨在:

1、建立一个支持跨语言集成、类型安全、高性能代码执行的框架

2、提供一个支持完整实现多种语言面向对象的模型

3、定义各语言必须遵守的规则,使得不同语言编写的对象能够交互作用。

CLR是CLI的一种实现。

CLR负责.NET程序的运行,内存分配、线程管理、安全、垃圾回收、类型安全检查等服务。

使用CLR编译器开发的代码成为托管代码。CLR能够自动处理对象布局、管理对象引用,对象不被使用时将被自动释放,这样的对象成为托管对象。

CLR的一个重要组成部分就是CTS(通用类型系统,Common Type System)。CTS定义了一个类型库,Visual Basic.NET和C#的类型系统是大体相似的。

CTS实际上是各编程语言的类型系统的并集,各语言编译后都会转换成CTS类型。

CTS类型一共分为两大类,引用类型和值类型,它们之间的转换方法分别称为装箱(Boxing)和拆箱(UnBoxing)。

CTS类型和Java一样,最终所继承的类型都是继承自Object类型,其中(引用类型直接继承自Object类型,值类型继承自ValueType类型,ValueType类型继承自Object)

值类型的变量直接存储数据,存储在托管栈中,引用类型的变量存储的是数据的引用,存储在堆中。例如String,Class,Interface就是引用类型,Char,Int32,Boolean是值类型。

指向堆中对象的引用可能不止一个,所以修改一个对象时会影响到所有对这个对象的引用。

托管栈中的变量会在创建它们的方法返回时自动被释放。托管堆中的变量不会在创建它的方法结束时就释放内存。类似于Java的Garbage Collection,当所指向的对象再也没有人引用到它时,它将会被Garbage Collection(垃圾回收,GC)机制回收。

GC不一定会在什么时候执行,强制执行GC的办法是调用System.GC.Collect()

装箱:当值类型转换为引用类型是,CLR会在托管堆分配一块内存,将值类型的数据复制到这块内存,然后将托管栈上另一个引用类型的变量指向这块内存。

拆箱:与上述过程相反。

将一个值类型的变量赋值给一个引用类型的变量时,系统会帮我们自动装箱。而拆箱操作需要指出拆箱后所表示的类型。

Int32 BirthdayNumber = 1023;        // CTS Int32型变量 BirthdayNumberObject BoxingBirthdayNumber = BirthdayNumber;   // 系统会自动装箱Int32 UnBoxingBirthdayNumber = (Int32)BoxingBirthdayNumber;  // 明确拆箱类型后拆箱

需要注意装箱和拆箱过程对性能有一定影响。

CLS(公共语言规范,Common Language Specification)是个语言类型系统的交集,为了获得语言之间对象的互操作性,设计一个语言之间最大交集CLS使得大家都支持。

不同编程语言编写的对象之间,对彼此公开的部分(如类,接口,方法,字段)应该是用符合CLS规范的类型。

private类,private方法,private字段,局部变量可不遵循CLS规定。

public类,public成员,以及可以通过子类间接访问的父类成员,需要遵循此约定。

互操作性:调用非托管代码的方式可以通过P/Invoke服务。

C#程序会进行两次编译,第一次编译CLR的编译器会将C#编译成中间代码(CIL,Common Intermediate Language)的指令,第二次编译是针对那些执行频率高的代码段在运行时通过某种机制判断,现场编译成本地代码。

基类库(BCL, Base Class Library)类似于SDK、JDK,提供了大量的基础功能,如文件操作、图形、网络、XML文档解析、安全、数据库访问等等。


0 0
原创粉丝点击