- A+
所属分类:.NET技术
类型与类型的分类(.NET FrameWork底层结构)
前言:int a=5;// a是一个变量,它的本质是一个System.Int32结构体的对象实例 |
类型到底是什么:类型是任何编程语言最底层的东西(所以每当提到XX是类型,不要想它的继承关系,因为它是代表底层的数据或数据结构)
类型是一组关键字,它同于声明一个标识符的基本数据类型或者抽象数据结构类型;
类型决定了一块内存到底要存什么样的数据/数据块或要刻画什么样的数据结构模板;
在.NET中,类型关键字和其他关键字一样,用蓝色字体
1)基本数据类型:基本数据类型类型声名的标识符称为变量,变量用来直接用于存储数据的值
基本数据类型的声明可以在数据结构类型中和方法体中,不允许定义在命名空间里
基本数据类型的定义就是一个定义变量的过程;
值类型:值类型的基本数据类型声明的变量直接存储值;(int,float,char,bool)
引用类型:引用类型的基本数据类型声明的变量用于存储对值(对象)的引用;(string、数组、object)
2)抽象数据结构类型:抽象数据结构的类型可以定义在命名空间中和数据结构类型中,不允许定义在方法体中
类是一个数据结构,我们把class,interface,delegate,struct,enum具有平行关系的(可以用于声明变量的)类型声明关键字统称抽象数据结构类型 |
抽象数据结构类型声明的又是一个自定义的数据类型(模型、模板),也就是说,一个抽象数据结构类型的标识符被定义完成之后,仍然作为一个类型的关键字来声明变量(这个变量就是自定义数据类型(模板)的对象,或者称为模板的实例化(类的实例化,委托的实例化,结构体的实例化、枚举的实例化....));
抽象数据类型的定义是一个建立模板的过程(或者说是建立一个自定义类型的过程);
模板被实例化,是一个模板被印刷的过程;被实例化后的模板就可以和其他 变量一样使用(变量就是一个对象);
.NET被声明的抽象数据结构类型标识符用:绿色字体(一个定义好的接口、枚举使用绿色)和 浅蓝色字体(一个定义好的类、结构体使用浅蓝色)
值类型:值类型的抽象数据结构类型所声明的类型的对象,他的值将用于直接存储对象实例的值;(Struct,Enum);
引用类型:引用类的抽象数据结构类型所声明的类型的对象,它的值是一个对对象实例的引用(class,Interface,delegate)
基本数据类型和抽象数据类型都分为值类型和引用类型, 它们的值类型直接存储(变量的值)/(对象的实例); 它们的引用类型存储(对值的引用)/(对对象实例的引用); |
规范化语言(更利于我逻辑清晰的理解知识) 1.当我们使用类型关键字声明一个模板或一个变量时,称这个模板/变量就是这个类型关键字,例如: class A{},称A是一个类/ A是类类型的; delegate void B{},B是一个委托/ B是委托类型的 GameObject Go;Go是一个GameObject/ Go是GameObeject类型的 string s;s是一个字符串/ s是字符串类型的 |
.NET中类型的隐式继承关系:(万物皆对象)
隐式继承在声明一个基本数据类型的变量或一个抽象数据类型的模板之后自动完成;
当使用基本数据类型关键字声明一个变量时,这个变量的值就是.Net中一个封装好的类(结构体)的实例
当使用抽象数据结构类型关键字声明一个模板时,.NET会让这个变模板会自动的按照后面的路径隐式继承在.NET中已经封装好的类/接口
tips:一些类型的隐式继承关系按F12是看不到的 ,必须在.NET文档中才能查看
1)值类型的隐式继承关系:(inherited by ValueType->Object)
使用值值类型声明的关键字是一个变量/对象,变量用于直接存储值;c#中,所有的值类型都隐式继承自ValueType)
下面表述了值类型的继承层次
基本数据类型:
int关键字->Int16(struct)/Int32(Struct)/Int64(Struct)->System.Valuetype->System.Object
上述含义是指:当使用int关键字声明一个整型变量时,这个变量本身是.NET中封装好的Int32结构体的一个对象; |
char关键字->System.Char->System.ValueType->System.Object //即一个char类型的变量实际上是一个System.Char结构体的对象
bool关键字->System.Boolean(Struct)->System.ValueType->System.Objecct
float关键字->System.Single(Struct)->System.ValueType->System.Objecct
......
综上:值类型的基本数据类型声明的变量本质是一个.NET预定义的结构体的对象,而这个结构体直接或者间接继承自System.ValueType
抽象数据结构类型
enum关键字->System.Enum(abstrct class)->System.ValueType->System.Object(Class)
enum关键字->System.Enum(abstrct class)->System.ValueType->System.Object(Class)
上述含义是指,当使用Enum关键字声明一个枚举时,.NET会让这个枚举会自动的按照后面的路径隐式继承在.NET中已经封装好的类/接口,下同 |
Struct关键字->System.ValueType->System.Object
综上:值类型的数据结构类型所声明的模板直接或者间接继承自System.ValueType
2)引用类型的隐式继承关系:
基本数据类型:
string关键字->System.String(class)->System.Object
[]数组->System.Array(class)->System.Object
抽象数据结构类型:
class关键字(未显示声明继承关系时)->System.Object
上述含义是指:当使用class关键字声明一个类时,这个类会自动继承自.NET中已经封装好的基类Object |
delegate关键字->System.Delegate(class)->System.Object
Interface关键字(未显示声明继承关系时)->不是System.Object的扩展类型,使用它声明的接口不不继承任何已封装好的类(特殊)
理解:使用c#等面向对象语言,万物皆对象不只是口号,更体现在了.NET FrameWork底层的类层次结构中; 1.所有用基本数据类型所声明的变量的本质:是其对应的已经封装好的类/结构体的对象; 例如:string声明的字符串变量本质是System.String类的对象; 操作:string s="";//使用F12会搜索到System.String类,说明s是System.String类的对象 2.所有的抽象数据结构类型所声明的模板,本质上都继承了已经封装好的类(interface除外,它没有继承自任何已封装好的类/结构体); 例如:delegate声明的委托,本质上是继承自System.Delegate类 当我们使用抽象数据类型声明时,我们实际上是在建立模板; 所以说,不管是基本数据类型声明的变量,还是模板的实例, |