概述

 

两个规范

CTS, Common Type System 通用类型系统

 

CTS 包括

1接口

2值类型{基本类型,结构,枚举}

3引用类型{类,装箱值类型,数组,委托}

 

CLS, Common Language Specification 公共语言规范

 

CLS定义了类型在运行时环境中创建和管理方式;

CLS主要关注语言的互操作性

解释:

各种不同的语言(C#,VBJScript),经过编译后,都生成相同的MSIL语言

可以为以下现像解释:

C#语言可以转换成VB.NET语言

VB.NET项目可以引用C#项目编译的DLL

 

CLR

CLR,Common Language Runtime 公共语言运行时

 

 

JIT(just in time)编译器

语言编译后生成MSIL语言

MSIL(简做IL)

 

虚拟机

我们应该很熟悉Java虚拟机..

一次编写代码,处处运行..当然也有人说一次编写,处处编译

 

区域

1堆栈

2托管堆

 

其它名词

GC

Garbase Collection 垃圾回收器

 

回收器的执行时间:

有两种方法可以实现

1 运行一条线程,定时调用从而进行清理工作..清理的时机由线程根据多种条件考虑

2 当新建对象时..即当你new class1()的时候..当然,并不是每次创建实例的时候,时机根据算法得出最佳时机进行清理..

 

.netGC是使用的第二种方法..

 

清理时的动作,当然GC只负责托管堆上的数据的清理

因为类都是自我描述的(从类本身的记录就可知道他有没有被引用,当然自我描述不仅仅是指这个功能)

 

发现有实例没有被引用时..就清理掉..

并对较小的堆进行压缩,使用在托管堆中的顺序连续.这样使用调用速度度加快.

C++里则是用链接来实现,当距离远时,检索时间成为一种小小浪费

 

但对大堆不进行压缩..因为对大堆的数据复制成为一种浪费

 

在进行回收操作时,会暂停应用程序

GAC

Global Assembly Cache 全局程序集缓存

 

一些结论

1 所有实体都是对象

 因为所有的类型都是继承于System.Object

2 值类弄是处处留副本,引用类型只有一个在托管堆里..

  可参看例子..

 

总结

 

 

 

数据类型

Dotnet的数据类型,IL的数据类型,CTS的类型分类

CTS只语言的设计标准..一般不常讨论..

.net的数据类型在不同的语言中表示又不相同..

这里我们讨论具体语言类型的时候都默认到C#的语言类型..

 

值类型

 

.net的值类型分为:基本类型,用户定义的值类型,枚举类型.

 

值类型都隐式地继承System.ValueType, System.ValueType是引用类型

值类型到处留副本..

 

所以有这样的结论:

大的值类型会减慢对象的内万分配,管理

 

结构是值类型

 

结构与类的区别,结构是简化了的类

 

1.结构至少要声明一个字段或事件

2结构自动拥有一个默认的无参构造函数。如果试图定义自己的无参构造函数,

编译器就会生成一个错误。这个构造函数用来执行所声明的字段的默认初始化。

数值字段初始化为0,布尔标记初始化为false,而对象引用设置为null*

不能定义自己的无参构造函数,但可提供带参数的构造函数。

3不能在结构中提供字段的初始化程序,必须在构造函数中执行初姑化(这和类不

同,类可以在声明时初始化字段)。但可以在定义时初始化const字段。

4结构不可以有析构函数,但可实现Dispose方法..

5不允许继承结构,不能被继承;能实现接口

 

 

面像对像开发规则有一条:

对变量定义为私有来最大化封装.

       public class Class1

       {

              private string userName;

              public string UserName

              {

                     get{return userName;}

                     set{userName=value;}

              }

       }

我们常听说这样便于维护如何理解?

如果你看过Asp.net Starter kits里的IssueTracker中对UserControl的操作..就知道怎么用的了.

举个例子..

假设有十五个页面调用了Class1,现在老板要求存储到数据库的Name必需加密

怎么办?十五个页面一个一个地修改?

只需在Class1里的Set 处理一下即可

set{ userName= Encrypt.MD5(value) ;}

对这条规则的透彻理解是检验是一条线..

 

 

 

Class1 c1 = new Class1()

在栈上分配一块内存给c1,在托管堆上建立一个Class1的区域(设为A)..并将c1的引用指向A.

 

 

枚举

枚举是值型

可用于枚举的类型有int short long byte

枚举是强类型的(不允许用整型值赋予枚举实例(强制可以,但不考虑其是否有效,都接收),必须使用成员名称..)

 

 

 

 

引用类型

 

 

1类有静态构造函数,只可有一个无参静态构造函数.

 2

 

数组

 

很久前写的
本来想搞清楚static方法调用和一般方法有什么区别
就查了些概念

参考书目
C#设计手册
高级.net程序设计