C#究竟为我们提供了哪些“数据类型”供我们使用?这些类型有什么样的“特征”?
数据类型的分类:
--- 数据类型是存放数据的容器。那么我们就以它们“存放数据的方式”分类!
1、值类型:变量中直接存放着“数据”
2、引用类型:变量中没有存放数据,数据存放在其他地方,而变量中只存放“真实数据的地址”
值类型 |
引用类型 |
变量中,存放“数据” |
变量中,存放“数据的地址” |
//整数 sbyte a; byte aa; short b; ushort bb; int c; uint cc; long d; ulong dd; //小数 float e; double i; decimal o; //字符、其他 char o; bool y; -------------------------------------------- 枚举“enum”、结构“struct” |
string u; object i; -------------------------------------------------- Class ---类 数组 、接口 |
所有的“基础数据”类型, 除了“string”、“object” |
所有的“自定义数据”类型, 除了“enum”、“struct” |
什么是“结构”struct?
---- 将类的数据,不在放置“堆”中,而宁可在“栈”中,开辟多个“关联数据空间”来存放!这样的形式我们叫做“结构”(就不在叫做类)。
---- 与Class内部结构相似(含有“属性”和“方法”),但它是“值类型”,变量中直接保存数据。目的是为了快速的数据访问。【轻量级的类】
----- 结构使用的注意事项:
- 结构中的字段不能够定义得“太庞大”
- 实例对象少,但访问频繁高,对访问速度有要求【应用场景】
- 直接将字段对外公开,字段不允许在定义时赋初值(定义)
使用时,可以直接定义后就使用,而 不用new操作(使用)
- 在项目中,更多是使用Class,而较少使用Struct
关于“赋值符号”【=】:
不论是“值类型”还是“引用类型”,赋值操作都是将“自身的副本”赋值给对方,所不同的是,值类型是“数据副本”,引用类型是“地址副本”!
但是,上述结论条件是:赋值符号两边的类型一致(值、引用),如果两边类型不一致时,则需要“装、拆箱”操作。
装、拆箱:
- 装箱 :值类型 -----> 引用类型 【1堆中申请空间 2赋值 3取回地址】
- 拆箱:引用类型 -------> 值类型
- 隐式装箱、显式拆箱; 先装箱、再拆箱
- 装拆箱操作能灵活的实现值类型和引用类型的转换;效率低、容易出错(拆箱)
关于“方法的参数”:
----- 形参:在方法定义时,写在“括号”中的变量,是没有也无法赋值的,就是一个“形式”,称为形参;
实参:在方法调用时,写在“括号”中的变量,具有真实的数据,所有叫做实参
------ 在程序实现时:【实参 ----> 形参 】进行数据传递时,存在两种方式:
方式一:实参将“真实的数据”,传递给形参(方法中),“值方式传递”;
(调用方法中对变量的修改,不会影响到原来传入的变量)
方式二:实参仅仅将“数据的地址”,传递给形参(方法中),“引用方式传递”
(调用方法中对变量的修改,会影响到原来传入的变量)
------ 常见的两种传递形式:
值方式传递: 当参数的数据类型是“值类型”时
引用方式传递:当参数的数据类型是“引用类型”时
当参数的数据类型是“值类型”时,使用了ref (来料加工)
当参数的数据类型是“值类型”时,使用了out (出口)
小贴士:
对于我们的应用软件来说:
所有的数据都存储“内存”中,计算机将他的内存区域划分成两种“区域”。
一个区域,小访问速度快,由程序自己管理 -----栈
一个区域,大访问速度较慢,管理自由度更高 ----堆
(程序中所有定义的“变量”,都存储在栈中)
方法中,结果数据的输出:
无结果 ---- void;
有一个结果 ----- 依据结果的类型定义;
有多个关联结果 ----- 专门为它创建一个容器(类、结构);
有多个但无关联 ----- 通过out参数;