C#复习笔记(三)
访问修饰符
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;
}
分部方法:
把方法的申明和实现分离