目录
1.构造函数
基本概念:在实例化对象时会调用的用于初始化的函数,如果不写,默认存在一个无参构造函数。构造函数的写法:没有返回值,函数名与类名必须相同,没有特殊需求时,一般是public的。
构造函数可以被重载,this代表当前调用该函数的对象自己。
注意:如果不自己实现无参构造函数而实现了有参构造函数,会失去默认的无参构造。
class Person
{
public string name;
public int age;
//类中是允许自己声明无参构造函数的
//结构体是不允许的
public Person()
{
name="Nicole Potter";
age=19;
}
}
2.构造函数的特殊写法
使用this指自己的参数
public Person (int age,string name)
{
this.age=age;
this.name=name;
}
public Person(string name)
{
this.name=name;
}
public Person(int age,string name):this(name)
{
Console.WriteLine("Person两个参数构造函数调用");
}
//在函数后面添加this(),即调用函数,若里面没有,则为无参函数调用。若里面有name,则调用上面传入name的函数。
//无参函数没有传入参数,后面也可以用this(),也是调用,(但是不能调用无参函数)
//如下,18是int类型,就是调用传入类型为int的函数
public Person():this(18)
{
name="Nicole Potter";
age=19;
}
//传入的参数可以不必等于原函数中的参数,如上图18!=19.即结果只要是int类型都可以调用int类型的函数。
3.析构函数(了解即可)
当引用类型的堆内存被回收时会用到该函数,对于一些需要手动处理内存的语言如C++,需要在析构函数中做一些回收处理。但是C#中存在自动垃圾回收机制GC,所以我们几乎不会怎么使用析构函数,除非,你想要在某一对象被垃圾回收时,做一些特殊的处理。
注意:在Unity开发中析构函数几乎不会被使用。
基本语法
~类名()
{
}
//当引用类型的堆内存被回收时
//析构函数是当垃圾真正被回收的时候才会调用的函数。
当它变成垃圾的时候还不会调用,只有当垃圾回收时才会调用。
析构函数与构造函数相反,当对象结束生命周期,如对象所在的函数已经调用完毕时,系统往往用来做“清理善后”的工作(例如在建立对象时用new开辟一片内存空间,delete会自动调用析构函数后释放内存)。
4.垃圾回收机制
当0代内存满了时,没有分配空间时开始触发垃圾回收机制,开始寻找没有引用的对象,如果有引用则被认为是可达对象,如果没有引用,则被认为是不可达对象,不可达对象就会被认为是垃圾。然后把没有引用的内存全部释放清空。
然后,把0代中有引用的转移到1代内存中,他们可能不是连续的,中间有很多空位。然后修改引用地址,使他们连续起来。
当1代满了的时候,1代会和0代一起释放,再把有引用的放在2代里面。只有当每一代满了的时候才会触发垃圾回收机制!0代和1代触发的速度会比2代快很多,因为2代里面有很多储存,每一代触发垃圾回收机制都会触发迁移。若2代也满了,就会0.1.2代一起释放。占用较大的对象会放在2代,目的是提升性能,因为触发使用CPU计算消耗时间。默认分配是从0代开始的。(GC触发耗时,影响玩家体验),我们可以使用手动触发。
GC是系统提供的专门用来垃圾回收的类。
注意:
GC指负责堆内存(Heap)的垃圾回收,引用类型都是存在堆内存的,所以它的分配和释放都是通过垃圾回收机制来管理。
栈内存是由系统自动管理的,值类型在栈中分配内存,他们有自己的生命周期,不用对他们进行管理,他们会自动分配和释放。
⚡如何手动回收?
手动触发垃圾回收机制的方法:
GC.Collect();
一般情况下,我们不会频繁调用,都是在loading过场景时才调用。