• 访问修饰符
    public——公共的
    private——私有的,只有内部可用
    protect——保护的,只有内部和子类可用
    internal——内部的,同一个程序集中的所有类都可以访问

  • 类 class
    class Name{}

  • 类对象
    Name n = new Name();

  • 成员变量
    申明在class语句块中
    用来描述对象的特征
    可以是任意变量类型
    是否赋值根据需求决定

    ps:如果要在类中申明一个和自己相同类型的成员变量时,不能对它进行实例化,会导致无限循环,内存溢出

  • 成员方法
    申明在class语句块中
    用来描述对象行为
    和函数申明规则相同
    不要加static关键字

  • 成员属性
    可用来进行加密处理

public string Name
{
  //get和set前可加访问修饰符,访问修饰符的权限要低于属性权限,
  //且不能让两者的访问权限同时低于属性,也就是不能同时为private,外部不能得也不能进
  get
  {
    return name;
  }
  set
  {
    name = "KunKun";
  }
}

//自动属性(能得不能改)
public bool Sex
{
  get;
  private set;
}

  • 索引器
    private Name[] name;
    private string name;
    private int[,] array;
    //让对象像数组一样通过索引访问其中元素
    //索引器可以写逻辑、可以重载
    //结构体内也可以写索引器,规则相同
    public Name this[int index]
    {
    get{return name[index]};
    set{name[index] = value};
    }

    //重载
    public int this[int a,int b]
    {
    get{return array[a,b]};
    }

    使用方式
    Name n = new Name();
    n[0] = new Name()

  • 静态成员 static
    与程序同生共死
    不需要实例化就可直接用类名点出使用
    静态函数中不能使用非静态成员,可在函数内部实例化后再调用即可使用(生命周期的差异性)
    不会被GC

  • 静态类和静态构造函数
    静态类只能包含静态成员,不能被实例化
    静态构造函数会被自动调用一次、不能有参数、不参与重载
    static class Test
    {
    static Test()//静态构造
    public Test()//不会被静态构造函数影响
    }

  • 构造函数
    实例化对象时,会调用用于初始化的函数,如果不写就会默认存在一个无参构造函数
    无返回值、函数名和类名相同
    可被重载

    public Name(int age):this() //用了this(),所以优先调用自己的无参构造
    this代表当前调用该函数的对象自己

  • 析构函数
    引用类型的对内存被回收时,会调用析构函数(在垃圾真正被回收时才会调用)
    在一些需要手动管理内存的语言就需要此函数来处理内存
    但在Unity开发中几乎不会使用析构函数

    语法:
    ~类名()
    {

    }

  • 垃圾回收机制GC(Garbage Collector)
    GC只负责堆(Heap)内存的垃圾回收
    引用类型都存放在堆中,所以分配和释放都由GC管理

    GC部分原理:
    0代、1代、2代内存,代是GC使用的一种分代算法
    新分配的对象都会被配置在第0代内存中
    每次分配都可能进行GC释放内存(0代内存满时)
    在第一次内存回收过程开始时,GC会认为堆中全是垃圾,会进行以下两步:
    1、标记对象,从根(静态字段、方法参数)开始检查引用对象,标记后为可达对象,未标记为不可达对象,
    不可达对象就被认为是垃圾
    2、搬迁对象压缩堆:释放未标记的对象、搬迁可达对象至1代内存、修改引用地址(修改搬迁至1代内存可达对象的内存地址)

    较大对象会被认为是2代内存,目的是减少性能损耗,提高性能,不会对大对象进行搬迁压缩(83kb以上的对象为大对象)

    手动触发GC的方法:GC.Collect();

  • 拓展方法
    当拓展方法和原方法名相同时,会调用原方法
    为现有非静态、变量类型添加新方法
    语法:
    访问修饰符 static 返回值 函数名(this 拓展类名 参数名,参数类型 参数名,...){}
    //后面的参数类型可以设置传入参数

    //给int类型添加一个SpeakValue的拓展方法
    public static void SpeakValue(this int value)
    {
    Debug.Log("拓展方法")
    }

    //调用方式
    int a = 6;
    a.SpeakValue;

    //自定义拓展方法
    public static void Fun(this Test t){}

    Test t = new Test();
    t.Fun();

  • 运算符重载 operator
    让自定义类和结构体能够使用运算符
    语法:
    访问修饰符 static 返回值 operator 运算符(参数列表){}
    1、条件运算符(>、<一对)必须成对出现
    2、一个符号可以多个重载
    3、不能使用ref和out

    可重载的运算符:
    算术、逻辑、位、条件运算符

    不可重载运算符:
    &&、||、[](索引符)、()强转运算符、特殊运算符、.点、?: 、=

  • 内部类和分部类
    内部类:
    一个类中再申明一个类
    (亲密关系的体现)

    分部类 partial:
    把一个类分成几步声明
    分部类可以写在多个脚本文件中
    访问修饰符要一致
    不能有重复的成员
    partial class Kun{
    public int Sing;
    }

    partial class Kun{
    public string Jump;
    }

    分部方法:
    把方法的申明和实现分离