Initial commit
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
概念:
|
||||
1. 声明在类中
|
||||
2. 用来描述对象特征
|
||||
3. 任意变量类型
|
||||
4. 是否赋值根据需求决定
|
||||
|
||||
|
||||
通常用法:
|
||||
|
||||
|
||||
语法:
|
||||
1. 声明:
|
||||
```Csharp
|
||||
enum E_SexType
|
||||
{
|
||||
male,
|
||||
female
|
||||
}
|
||||
class Human
|
||||
{
|
||||
string name;
|
||||
int age;
|
||||
E_Sex sex;
|
||||
Human[] friend; //==可以类里声明自己类的同类型 但是不能实例化!==
|
||||
}
|
||||
```
|
||||
2. 访问修饰符
|
||||
public——公共的 类内部和外部都可以进行访问
|
||||
private——私有的 只有内部才能访问 ==子类不行==
|
||||
protected——保护的 只有自己内部和子类才可以访问
|
||||
3. 成员默认值
|
||||
可以看[[值类型和引用类型]]
|
||||
懒得看可以cw(default(变量类型))
|
||||
|
||||
案例:
|
||||
```Csharp
|
||||
class Human
|
||||
{
|
||||
string name;
|
||||
int age;
|
||||
E_Sex sex;
|
||||
Human[] friend; //==可以类里声明自己类的同类型 但是不能实例化!==
|
||||
}
|
||||
Human h1 = new Human();
|
||||
h1.age = 18;
|
||||
cw(h1.age);
|
||||
```
|
||||
|
||||
|
||||
注意:
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
概念:
|
||||
==和成员变量不完全是一个概念!!!!==
|
||||
1. 用于保护成员变量
|
||||
2. 为成员属性的获取和复制添加逻辑处理
|
||||
3. 解决3P局限性
|
||||
自动属性
|
||||
|
||||
通常用法:
|
||||
配合private加密或规范成员属性的修改获取等
|
||||
让其==只能获取不能修改== 或 ==只能修改不能获取==
|
||||
|
||||
语法:
|
||||
属性声明:
|
||||
```Csharp
|
||||
访问修饰符 属性类型 属性名
|
||||
{
|
||||
get{}
|
||||
set{}
|
||||
}
|
||||
```
|
||||
|
||||
案例:
|
||||
```Csharp
|
||||
class Person()
|
||||
{
|
||||
private int age;
|
||||
private string name;
|
||||
private int money;
|
||||
private bool sex;
|
||||
public string Name [[命名法|帕斯卡命名法]]
|
||||
{
|
||||
get==必须有返回值==
|
||||
{
|
||||
//这里写处理获取内容的逻辑
|
||||
return name;
|
||||
}
|
||||
set
|
||||
{
|
||||
//这里写处理修改/添加内容的逻辑,不写就没有
|
||||
==//关键字value 用于表示外部传入的值 只在set中有==
|
||||
name = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Person p = new Person();
|
||||
~~p.name = xxx~~ 因为private所以没法用.name
|
||||
p.Name = xxx;
|
||||
```
|
||||
|
||||
↑写了一个public的属性大家都可以访问,用该属性Name进行修改 return直接返回原始的name,set时使用.Name将xxx作为传入参数放到set的value关键字中
|
||||
|
||||
案例2:
|
||||
```Csharp
|
||||
public int Money()
|
||||
{
|
||||
get
|
||||
{
|
||||
return money;
|
||||
}
|
||||
set
|
||||
{
|
||||
if(value<0) value = 0;
|
||||
cw(没钱);
|
||||
money = value;
|
||||
}
|
||||
}
|
||||
```
|
||||
↑最简单的防止money为负数的逻辑
|
||||
|
||||
注意:
|
||||
成员属性不加访问修饰符,会使用成员变量声明时的访问权限
|
||||
==get和set也可以加访问修饰符,但是不能大于成员属性前访问修饰符的权限==
|
||||
可以只有一个set或只有一个get(只能得或只能改),但是通常没人这么干
|
||||
|
||||
自动属性
|
||||
相当于声明了一个成员变量,但是好处是可以添加访问修饰符
|
||||
案例:可以得,但是不能改得一个成员↓
|
||||
```Csharp
|
||||
public float Height
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,145 @@
|
||||
# 构造函数:
|
||||
概念:
|
||||
实例化时,用于初始化的函数
|
||||
不写默认有一个无参构造函数
|
||||
==可以重载==
|
||||
|
||||
通常用法:
|
||||
自定义初始化规则
|
||||
|
||||
语法:
|
||||
访问修饰符 类名(){}
|
||||
|
||||
案例:
|
||||
```Csharp
|
||||
class Person()
|
||||
{
|
||||
public string name;
|
||||
public int age;
|
||||
public Person()
|
||||
{
|
||||
name = "默认值";
|
||||
age = 默认值;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
this关键字:
|
||||
this指当前类声明的成员变量
|
||||
```Csharp
|
||||
class Person()
|
||||
{
|
||||
public string name;
|
||||
public int age;
|
||||
public Person()
|
||||
{
|
||||
name = "默认值";
|
||||
age = 默认值;
|
||||
}
|
||||
public Person(int age,string name) //重构
|
||||
{
|
||||
this.name = name;
|
||||
//后面的name是传递的参数,this.name是最上方public int出来的
|
||||
this.age = name;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
特殊写法:
|
||||
通过this重用构造函数代码,即先调用无参构造函数,然后在调用这个特殊写法的构造函数
|
||||
语法:访问修饰符 构造函数名(参数列表):this(【可选】参数1,参数2.....)
|
||||
例子:
|
||||
```Csharp
|
||||
public Person(int age, string name):this(age)
|
||||
{
|
||||
balabala
|
||||
}
|
||||
```
|
||||
过程:先调用无参Person构造函数,然后寻找只有构造单个参数age的构造函数进行初始化
|
||||
|
||||
注意:
|
||||
==函数名和类名必须相同==
|
||||
==没有特殊用途,一般都是public==
|
||||
|
||||
==如果写了有参构造函数且自己没有保留无参构造函数,那么类在实例化时只能使用有参构造函数且无法使用无参构造函数==
|
||||
|
||||
|
||||
|
||||
----
|
||||
# 析构函数
|
||||
概念:
|
||||
当引用类型堆内存被回收时,会调用该函数
|
||||
对于需要手动管理内存的语言(C++),需要在析构函数中做一些内存回收处理
|
||||
C#有自动垃圾回收机制GC
|
||||
Unity中基本不用管
|
||||
|
||||
通常用法:
|
||||
|
||||
|
||||
语法:
|
||||
```Csharp
|
||||
~类名()
|
||||
{
|
||||
}
|
||||
```
|
||||
案例:
|
||||
```Csharp
|
||||
~Person()
|
||||
{
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
注意:
|
||||
|
||||
|
||||
----
|
||||
# 垃圾回收
|
||||
垃圾回收(GC)
|
||||
通过遍历堆Heap上动态分配的所有对象
|
||||
通过识别他们是否被引用来确定哪些对象时垃圾,哪些对象仍然需要引用
|
||||
垃圾:没有变量或对象引用的内容
|
||||
如果是垃圾就要被回收释放
|
||||
|
||||
一般都是==被动触发(会造成卡顿)==,所以游戏一般需要手动执行垃圾回收
|
||||
语法:GC.Collect();
|
||||
==GC会造成卡顿,所以在加载Loading时一般会调用==
|
||||
|
||||
垃圾回收有多种算法
|
||||
引用计数
|
||||
标记清楚
|
||||
标记整理
|
||||
复制集合
|
||||
|
||||
注意:
|
||||
GC只负责Heap内存的垃圾祸首
|
||||
引用类型都是在Heap中的,所以他需要GC来进行管理
|
||||
|
||||
栈Stack上的内存时系统自动管理的
|
||||
所以不需要GC
|
||||
|
||||
C#中垃圾回收机制的大概原理
|
||||
他会把内存分为0,1,2代内存
|
||||
代的概念是垃圾回收中的一种算法需要
|
||||
新分配的对象都会被配置在第0代内存中
|
||||
每次分配都可能会进行垃圾回收(一般来说0代内存满了就会触发)
|
||||
在第一次内存回收过程开始时,垃圾回收器会认为堆中全是垃圾,会进行一下两部
|
||||
1.标记对象,从根(静态参数、方法参数)开始检查引用对象,标记后为可达对象,未标记就是不可大对象
|
||||
不可达对象就会认为是垃圾
|
||||
2.搬迁对象 压缩堆 (挂起执行内存托管代码线程:把第0代内存(还不是垃圾的内存)放到一代进行搬迁)释放未标记的对象、搬迁可达对象、修改引用地址
|
||||
|
||||
大对象总被认为是二带内存,目的是减少性能损耗
|
||||
不会对大对象进行压缩搬迁 大对象是85000kb以上的
|
||||
|
||||
示意图
|
||||
step1:程序放入内存
|
||||
![[Pasted image 20260412210327.png|697]]
|
||||
step2:发现沾满了
|
||||
![[Pasted image 20260412210704.png]]
|
||||
step3:原来的地址搬迁,无引用的垃圾丢掉
|
||||
![[Pasted image 20260412210810.png]]
|
||||
step4:D放入
|
||||
![[Pasted image 20260412210946.png]]
|
||||
step5:如果0代1代后续又满了,那么这套算法会同时做用在两代内存中,以此类推
|
||||
类似多级缓存cache,L1最快但常换L3最慢
|
||||
#基础
|
||||
@@ -0,0 +1,34 @@
|
||||
概念:
|
||||
让对象像数组一样可以通过下标访问,方便程序编写
|
||||
|
||||
通常用法:
|
||||
|
||||
|
||||
语法:
|
||||
```Csharp
|
||||
访问修饰符 返回值 this[参数类型 参数名1,参数类型 参数名2.....]
|
||||
{
|
||||
get{} ==内部写法和属性相似==
|
||||
set{}
|
||||
}
|
||||
```
|
||||
|
||||
案例:
|
||||
```Csharp
|
||||
class Person
|
||||
{
|
||||
private string name;
|
||||
priavte int age;
|
||||
private Person[] friends;
|
||||
public Person this[int index]
|
||||
{
|
||||
get{return friends[index];}
|
||||
set{friends[index] = value;}
|
||||
}
|
||||
}
|
||||
|
||||
Person p1 = new Person();
|
||||
p[0] = new Person();
|
||||
```
|
||||
注意:
|
||||
|
||||
Reference in New Issue
Block a user