概述
两个规范
1CTS, Common Type System 通用类型系统
CTS 包括
1接口
2值类型{基本类型,结构,枚举}
3引用类型{类,装箱值类型,数组,委托}
2CLS, Common Language Specification 公共语言规范
CLS定义了类型在运行时环境中创建和管理方式;
CLS主要关注语言的互操作性
解释:
各种不同的语言(C#,VB,JScript),经过编译后,都生成相同的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()的时候..当然,并不是每次创建实例的时候,时机根据算法得出最佳时机进行清理..
而.net的GC是使用的第二种方法..
清理时的动作,当然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) ;}
对这条规则的透彻理解是检验是一条线..
Class
在栈上分配一块内存给c1,在托管堆上建立一个Class1的区域(设为A)..并将c1的引用指向A.
枚举
枚举是值型
可用于枚举的类型有int short long byte
枚举是强类型的(不允许用整型值赋予枚举实例(强制可以,但不考虑其是否有效,都接收),必须使用成员名称..)
引用类型
类
1类有静态构造函数,只可有一个无参静态构造函数.
2
数组
很久前写的
本来想搞清楚static方法调用和一般方法有什么区别
就查了些概念
参考书目
C#设计手册
高级.net程序设计