●上图蓝色代表什么?基本(C#内建)数据类型:最基本的最基础的数据类型。
变量、对象与内存
●变量 = 以变量名所对应的内存地址为起点,以其数据类型所要求的的存储空间位长度的一块内存区域。
●变量名表示(对应着)变量的值在内存中的存储位置
变量名其实就是地址,指向存储地址;每一个变量都对应着相应类型。变量类型其实就是告诉计算机系统往后数多少个字节,这段内存保存我变量的值。
如:int x =1;
●Object->值类型变量
怎么理解“值类型变量 ”的存储?https://www.yuque.com/u25921175/yrvhq9/qg5o0q
○位数不足时,高位补0
○有正负值范围的变量类型,最高位判断正负
○怎么表示负值?按位取反 再 +1
●Object->引用类型变量
怎么理解 “引用类型变量” 的存储?https://www.yuque.com/u25921175/yrvhq9/cfzli6
引用类型变量原理:引用类型变量装的是实例地址。
●局部变量在Stack上分配内存
局部变量、形参在栈上;实例变量在堆上;全局变量,静态变量在静态区;动态内存分配在堆上开辟。
上述实例中,stu、stu2在main函数中作为局部变量分配到栈上;new Student()则作为实例在堆上开辟。
●变量的默认值
一旦变量在内存上分配好后,统统刷成0,这就是它的默认值。
疑问:要是声明一个本地变量(也叫局部变量),它会不会有默认值呢?
解答:如果在C语言、C++中会有默认值,C#为了避免不安全的代码出现,初始值不让编译过去,必须有赋值。
●常量 const
顺便讲一下变量的声明:
const int x =100;
其中const作为修饰符,代表常量,值不可被改变;变量名为x;初始化器为=。
●装箱与拆箱
拆箱和装箱实质上是值类型与引用类型之间的转换。
装箱简述:把栈上值类型的值封装成Object类型实例放在堆上
拆箱简述:把堆上值类型的值拆成我目标数据类型存储到栈上
拆箱和装箱会损失程序的性能
装箱:当我们的计算机发现Object对象引用的值,不是堆上的实例,而它是栈上的值类型的值的时候:
①把栈上的值类型值Copy到堆上(找一块可存储的空间)
②把地址转化成二进制,再把这个地址存储到obj变量对应的内存空间里面来,构成obj引用变量对堆上变量实例的引用(里面封装了刚才的整数,也叫装箱)
拆箱:想要obj在堆上面那个内存里存储的整数值怎么办?
把堆里面的整数值Copy到栈上(而不是地址)
namespace TypeCSharp
{
class Program
{
static void Main(string[] args)
{
int x = 100;
//装箱
object obj = x; //obj实际上是一个引用类型,在内存上分4个字节的内存单元
//拆箱
int y = (int)obj;
}
}
class Student
{
uint ID;//值类型(32位)
ushort Score;//值类型(16位)
}
}