构造函数
基本内容不写了,学过c++或java都知道。
构造函数的特殊写法
通过this重用构造函数代码,结构为:
public 类命():this(参数1,…);
class Person
{
string name;
int number;
public Person(int number)
{
this.number = number;
}
public Person(string name,int number):this(number)
{
this.name = name;
}
static void Main(string[] args)
{
Person person = new Person("xiaomin",123);
Console.WriteLine("{0} {1}", person.name, person.number);
GC.Collect(1);
Console.ReadKey();
}
}
析构函数(了解)
垃圾回收机制
垃圾回收,英文简写为GC。
垃圾回收的过程是在遍历堆(Heap)上动态分配的所有对象,所谓垃圾就是没有被任何变量,对象引用的内容。
原理:分为0代内存、1代内存、2代内存
代的概念:
代是垃圾回收机制使用的一种算法,新分配的对象都会被配置在第0代内存中
在一次内存回收过程开始时,垃圾回收器会认为堆中全是垃圾,会进行以下两步:
1.标记对象,从根(静态字段、方法参数)开始检查引用对象,标记后为可达对象,未标记为不可达对象。不可达对象就是垃圾。
2.搬运对象压缩堆 释放未标记的对象 搬运可达对象 修改引用地址
解释:比如我们new了3个对象,也就是在堆中开辟了3块空间,3个对象为我们正在使用对象,标记为可达对象,假设第0代内存满了,我们会将第0代的3个可达对象搬运到第1代内存,而且刚搬运过来不是连续空间,第1代内存会将它们压缩成连续空间,然后原来的在0代上的3块空间成为不可达对象就要释放掉,这样我们就修改对象的引用地址(从0代到1代)。
如果1代也满了,在从1代搬运到2代的过程中,要释放0代和1代的内存,搬运步骤一样,所以第0代中都是新分配对象,而1代和2代都是旧对象。
大对象总被认为是第二代内存,目的是减少性能损耗,提高性能。不会对大对象进行搬运压缩,大约83kb以上的为大对象。
当然这都是堆内存满的时候才能垃圾回收,我们也可以手动触发:
static void Main(string[] args)
{
//在场景加载时调用比较好,防止游戏卡顿
GC.Collect();
Console.ReadKey();
}