二:堆和栈:程序运行时的内存区域
我们把内存分为堆空间和栈空间。
栈空间比较小,但是读取速度快
堆空间比较大,但是读取速度慢
1.栈
栈的特征:
数据只能从栈的顶端插入和删除
把数据放入栈顶称为入栈(push)
从栈顶删除数据称为出栈(pop)
简单地说:先进后出
2.堆
堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除
3.值类型和引用类型
类型被分为两种:值类型(整数,bool struct char 小数)和引用类型(string 数组 自定义的类,内置的类)。
1)值类型只需要一段单独的内存,用于存储实际的数据,(单独定义的时候放在栈中)
2)引用类型需要两段内存
第一段存储实际的数据,它总是位于堆中
第二段是一个引用,指向数据在堆中的存放位置
注意: 但我们使用引用类型赋值时,其实是赋值的引用类型的引用,如果数组是一个值类型的数组,那么数组中直接存储值,如果是一个引用类型的数组(数组中存储的是引用类型),那么数组中存储的是引用(内存地址)。
下面举一些例子,有兴趣的可以实现一下:
static void Main(string[] args)
{
//Test1();
//Test2();
// Test3();
//Test4();
Test5 ();
Console.ReadKey();
}
static void Test1()
{
int i = 34;
int j = 34;
int temp = 334;
char c = 'a';
bool b = true;
}
static void Test2()
{
int i = 34;
int j = 234;
string name = "siki";
}
static void Test3()
{
string name = "siki";
string name2 = "taikr";
name = name2;
name = "google";
Console.WriteLine(name+":"+name2);
}
static void Test4()
{
Vector3 v = new Vector3();
v.x = 100;
v.y = 100;
v.z = 100;
Vector3 v2 = new Vector3();
v2.x = 200;
v2.y = 200;
v2.z = 200;
v2 = v;
v2.x = 300;
Console.WriteLine(v.x);
}
static void Test5()
{
Vector3[] vArray = new Vector3[]{ new Vector3(), new Vector3(), new Vector3() };//如果数组是一个值类型的数组,那么数组中直接存储值,如果是一个引用类型的数组(数组中存储的是引用类型),那么数组中存储的是引用(内存地址)
Vector3 v1 = vArray[0];
vArray[0].x = 100;
v1.x = 200;
Console.WriteLine(vArray[0].x);
}
}