类型
是什么
类型(数据类型):性质相同的值的集合,有专门的具体操作
确定了数据类型,就知道在内存中占多大
内存给小了,会丢失精度(显式类型转换)
内存给大了,会造成浪费(隐式类型转换)
强类型编程语言:数据类型有约束
弱类型编程语言:数据类型无约束
作用
- 明确占用内存空间
- 明确可表示最大、最小范围
- 明确所有成员(方法、属性、事件)
- 明确派生关系
- 明确内存分配具体位置
- 明确允许的操作
Type myType = tepeof(Form);
Console.WriteLine(myType.IsClass); // 是不是类
Console.WriteLine(myType.Name); // 打印类型名Form
Console.WriteLine(myType.FullName); // 打印类型全名
Console.WriteLine(myType.BaseType.FullName); // 打印类型基类全名
Console.WriteLine(myType.BaseType.BaseType.FullName); // 打印类型基类的基类全名
// 打印所有属性
PropertyInfo[] plnfos = myType.GetProperties();
foreach (var p in plnfos)
{
Console.WriteLine(p.Name);
}
// 打印所有方法
MethodInfo[] mlnfos = myType.GetMethods();
foreach (var p in mlnfos)
{
Console.WriteLine(p.Name);
}
- 栈(小,几M)stack:方法调用
- 堆(大,几个G)heap:存储对象(实例)
类型系统
类(Classes):如Windows, Form, Console, String
结构体(Structures):如lnt32, Int64, Single, Double
枚举(Enumerations):如HorizontalAlignment, Visibility
接口(Interfaces)
委托(Delegates)
水蓝色都是能跳转的,黑色都是需要补充的
变量、对象、内存
变量名:表示变量值的存储位置
7种变量:
- 静态变量:static,不用实例化就可以使用
- 成员变量(字段):类似属性,但是裸露在外,不受保护
- 数组元素:int[] array = new int[100];第一个元素:array[0],最后一个元素:array[99]
- 值参数:普通参数
- 引用参数:ref
- 输出形参:out
- 局部变量:方法体中的变量
变量 = 以变量名所对应的内存地址为起点,以其数据类型所要求的存储空间为长度的一块内存区域
值类型存储:根据大小直接放在堆中,从高位往低位存
引用型存储:(1)Student stu,会创建一块地址区域(32位就是4个字节,64位就是8个字节),内容统统刷0(表示该变量没有引用任何实例)用于存储堆的地址;(2)stu = new Student();才会去堆里创建实例,根据uint ID和ushort scroe分配内存空间
其他
有符号(正->负):按位取反+1
局部变量在栈上分配内存
实例变量在堆上分配内存
值类型:默认情况下,值类型存储在栈上,但当被装箱时,它们在托管堆上分配空间。
引用类型:存储在托管堆上,但是引用(即指向对象的指针)存储在栈上或作为局部变量。
局部变量:无论是值类型还是引用类型,作为方法的局部变量,它们的引用或值通常存储在栈上。
静态变量:静态变量存储在托管堆上,因为它们属于类型本身,而不是任何特定的实例。
常量(const):不能被再次赋值,且初始化器不能省略,就是一开始就要赋值,通常变量名全大写
装箱(值->引用)&拆箱(引用->值):会损失性能
int x = 100;
object obj = x; // 引用的不是堆上的实例,而是栈上的值(即先把x装箱,在赋给obj)
(栈->堆)装箱:把值拷贝到堆上,再把地址存在obj开辟的空间中
(堆->栈)拆箱:把堆中的值挪到栈上