面向对象基本概念

其他编程方式:面向过程编程;
三大特征:封装+继承+多态;
七大原则:
1.单一原则:一个类只处理自己应该处理的。应该各司其职,例如把每个移动技能都尽量写出一个类,方便修改。
2.开闭原则:新功能尽量是加处理而不是改代码。继承就是最明显的开闭原则,不要修改模板的内容,例如定义属性要用方法定义, getset,方便修改,修改类时或者改别人的方法,不清楚逻辑的就再写一个类。
3.依赖倒置原则:不依赖于具体实现,要依赖抽象(接口)。要依赖于抽象,不要依赖于具体实现,可以先了解需求,再画图,最后变成代码。
4.接口隔离原则:一个接口一个行为。接口里的单一原则,需要分的事件要分清楚。
5.里氏替换原则:用父类容器装载子类,任何地方子类都能替换父类。不要修改别人的代码,可以继承他的代码去重写(注:多态:父类的指针指向子类,而调用子类的方法)
6.合成复用原则:尽量用组合复用的形式。继承关系中,父类要可以解决子类共同的问题,子类时解决特与的问题,能用现有的类,就别再自己创建类。
7.迪米特法则:一个类尽量减少对别的类引用。又叫最少知识原则,减少耦合性,类自己能解决的,尽量不要牵扯别的类,比如A类引用B类的方法,但是B类方法参数改了,A类也要改。

面向对象三特征-封装

一般类定义:

类和对象

class 类名{
  类名 对象名=new 类名; 
}

类一般成员和封装

成员变量:成员变量是声明在类中的变量,可以是任意类型;
成员方法(函数):类的成员函数是一个在类定义中有它的定义或原型的函数;
访问修饰符种类:public(接口成员、命名空间、枚举默认)、private(类成员)、protected、internal(类、结构、接口、委托默认);

构造函数

构造函数:类的构造函数是类的一个特殊的成员函数,当创建类的新对象时执行,构造函数的名称与类的名称完全相同,它没有任何返回类型默认的构造函数没有任何参数,但是如果你需要一个带有参数的构造函数可以有参数,这种构造函数叫做参数化构造函数。这种技术可以帮助你在创建对象的同时给对象赋初始值,以下是它的特殊写法:

public 类名(参数1,参数2):this(参数1){
  //默认会先调用无参构造(this)或者父类构造函数(换成base)
}

##析构函数
析构函数:类的 析构函数 是类的一个特殊的成员函数,当类的对象超出范围时执行,析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数,析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源,就是当引用类型的堆被回收时被调用,析构函数不能继承或重载。

垃圾回收机制

定义:简称GC,当堆(Heap)中的变量没有被任何对象引用时,就会被自动回收;
算法:引用计数、标记清除、标记整理、复制集合;
注意事项:GC只负责堆的垃圾回收,而栈(stack)的内存时系统自动管理的,值类型有自己的生命周期,会自动分配和释放;
原理:C#会把堆中的内存分为0代内存、1代内存、2代内存(代是分代算法,代系数越大速度越慢,内存越大),新分配的对象会配置在0代内存,每次分配都可能会进行垃圾回收释放内存(0代内存或者1代内存满时),垃圾回收机制确认堆中的垃圾,首先会标记对象,发现是否有引用,标记后可达对象,未标记未不可达对象(垃圾),然后就将对象压缩堆(挂起执行托管代码线程)释放垃圾,搬迁可达对象地址到下一代内存(到第二代内存不会在搬迁),大对象(83kb以上)总认为是第二代内存。
手动触发代码:GC.Collect();一般Loading过场景调用

成员属性

语法:

访问修饰符 属性类型 属性名{
  访问修饰符 get{}//自动属性可以省略{}
  访问修饰符 set{}//自动属性可以省略{}
}

索引器

概念:让对象可以像数组一样通过索引访问元素,索引器可以重载;
语法:

访问修饰符 返回值 this[参数1、参数2]{
  get{}
  set{}
}

静态类和静态成员static

静态类:不能被实例化,只能有静态成员;
静态变量:当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本;
静态函数:这样的函数只能访问静态变量。静态函数在对象被创建之前就已经存在;
静态构造函数:不能使用访问修饰符,不能有参数,使用静态类或者普通类的成员时会自动且仅调用一次;

拓展方法

特点:一定是写在静态类,一定是静态函数,第一个参数为拓展目标,第一个参数用this修饰;
语法:

访问修饰符 static 返回值 函数名(this 拓展类名 参数名,参数1,参数2){
}

运算符重载

概念:使用operator关键字让自定义类和结构体可以使用运算符;
特点:一定是公告静态方法,返回值在operator前(条件运算要成对出现,一个符号可以多个重载,不能使用ref和out);
语法:

public static 返回类型 operator 运算符(参数列表){
}

不可重载的运算符:逻辑与&& 、逻辑非||、索引符[]、强转符号()、点.、三目运算符?:、赋值符号=;

内部类和分部类

内部类定义:在一个类中再声明一个类,使用时要外部类点出自己;
分部类:用partial把类分成几部分,注意访问修饰符要一样;
分部方法:用partial将方法声明和实现分离,强制私有,只能在分部类声明,不能有返回值,不能用out关键字;

面向对象三特征-继承

继承基本规则

语法:

class 类名 :被继承的类{
  
}

里氏替换原则

概念:任何父类出现的地方,子类都可以替代
语法:

父类 变量名=new 子类();

###is关键字
定义:判断一个对象是否为指定类对象,返回bool值
语法:对象 is 类名

###as关键字
定义:将一个对象转换为指定类对象,没有返回null
语法:对象 as 类名

继承中的构造函数

特点:实例化时先执行父类构造函数,再执行子类构造函数;

万物之父和装箱拆箱

万物之父关键字:object
装箱:例如object存储值类型发生,把值类型从栈中迁移到堆中,变成引用类型;
拆箱:例如把object转为值类型发生,把引用类型从堆中迁移到栈中,变成值类型;

密封类

概念:使用sealed关键字使类无法再被继承;

面向对象三特征-多态

vob

关键字:virtual(虚函数)和override(重写);

抽象类和抽象方法

关键字:abstract(抽象函数);
特点:抽象类不能被实例化,但是遵守里氏替换原则,抽象方法没有方法体;

接口

关键字:interface;
特点:不包含成员变量,只有抽象方法、属性、索引器、事件,成员不能被实现,不能是私有成员,类可以继承多个接口,接口也遵守里氏替换原则;
作用:不作为实体基类,但是可以作为一个行为基类;
命名规则:帕斯卡命名法前面加I;

###显示实现接口
作用:当实现俩个接口后,其中有相同方法时;
语法:用接口名点出方法名;

密封方法

关键字:sealed修饰不能再被重写;

面向对象相关知识点

命名空间

特点:命名空间可以包裹命名空间;
语法:

namespace 命名空间名{
  
}

万物之父中的方法

静态方法Equals:判断俩个对象是否相等,值类型比较数值,引用类型比较地址;
静态方法RefereceEquals:判断俩个对象引用是否相等,主要用于应用类型,值类型返回始终false;
普通方法GetType():获取对象运行时的类型(反射相关);
普通方法MemberwiseClone:拷贝对象,引用对象指向相同地址;
虚方法Equals:相当于RefereceEquals,但是在种类中ValueType中重写了,可以用来比较值相等;
虚方法GetHashCode:获取对象哈希值(对象唯一编码,但是也可能u不同对象哈希码一样);
虚方法ToString:返回对象代表的字符串;

string

注意事项:string大部分方法需要赋值再使用,因为会实例化一个新的字符串;
字符串名[]:字符串索引器;
(静态)string.Format():字符串拼接(替代);
字符串名.IndexOf():正向查找字符位置;
字符串名.LastIndexOf():反向查找字符位置;
字符串名.Remove():移除指定位置的字符;
字符串名.Replace():替换指定字符串;
字符串名.ToUpper():字符串全部大写;
字符串名.ToLower():字符串全部小写;
字符串名.Substring():字符串截取;
字符串名.Split():字符串切割;

StringBuilder

作用:修改字符串而不创建新的对象
字符串.Capacity:获取容量;
字符串.Append:增;
字符串.AppendFormat():拼接;
字符串.Insert():插入;
字符串.Remove():删;
字符串.Clear():清空;
索引-字符串[]:用来查和改;
str.Replace():替换;

字符串拼接的方式

直接通过+拼接

会有性能问题,字符串少还好,越多GC越严重。

通过StringBuilder拼接字符串

字符串数量越多性能相对直接+拼接方法越高。

通过StringBuffer拼接字符串

区别:线程安全版的StringBuilder,但是性能不如StringBuilder;

string.Format

原理:其底层本质还是StringBuilder来实现的;

$方式拼接字符串

原理:是string.Format简化版,C#6.0新增操作;
语法:

string str = $"my name is{name}, I'm {age} years old";

知识拓展

多脚本文件

.cs:源码文件
.sln:解决方案入口文件
.dll:编译文件

UML

定义:统一建模语言,是面向对象设计的建模语言;
理解:可以通过一些UML可视化软件(visio)就可以生成代码;