29.总结
29.1 知识点
学习的主要内容
强调
29.2 核心要点速览
封装
类 和 对象
- 类:模板/类型,定义特征(成员变量)、行为(成员方法)以及构造/析构等。
- 对象:类的实例,引用类型,必须
new
(或声明为null
)。
成员变量
- 用途:描述对象特征。
- 位置:类体内,任意类型,任意数量。
- 默认值:值类型 = 0/false,引用类型 =
null
。 - 访问:由访问修饰符 (
public
/private
/protected
) 控制。
成员方法
- 用途:描述对象行为。
- 规则:写在类体内;不用
static
;通过实例调用;可有任意参数和返回值。
构造 / 析构
构造函数
- 名称同类,无返回值,可重载。
- 用于初始化成员;有参顶掉默认无参;可用
this(...)
链接重用。
析构函数
~ClassName()
,无参数,无修饰符。- GC 回收对象时调用,C# 中少用。
C#垃圾回收机制
- 自动回收:对象无引用时,GC自动回收内存,无需手动释放。
- 分代策略:
- 第0代:新对象(优先回收)
- 第1代:短期存活对象
- 第2代:长期存活对象(如静态变量)
- 触发条件:内存不足、手动调用
GC.Collect()
或系统压力大时。 - 回收流程:
- 标记:从根对象遍历标记可达对象。
- 清除:回收未标记对象。
- 压缩:整理内存碎片。
- 优势:防内存泄漏,简化开发。
- 注意:
- 非托管资源(如文件句柄)需用
using
或Dispose()
手动释放。 - 频繁GC影响性能,避免过度创建对象。
- 非托管资源(如文件句柄)需用
成员属性 (Properties)
用途:包装字段,添加 get/set 逻辑,保护成员变量。
语法:
public Type Name { get { … } set { … } // value 代表外部赋值 }
可选:
get
/set
可单独存在;可加访问修饰符;支持自动属性:public int X { get; private set; }
.
索引器 (Indexers)
用途:让对象像数组一样用
obj[index]
访问内部集合。语法:
public ElementType this[int index] { get { … } set { … } }
可重载:参数数量/类型不同视为不同签名。
静态成员 & 静态类
- 静态成员:
static
修饰字段、方法、属性等,程序启动即分配,用法:ClassName.Member
。 - 静态类:只能包含静态成员,不能实例化,常作工具类。
- 静态构造:
static ClassName() { … }
,无修饰符、无参数,仅调用一次,用于初始化静态成员。
拓展方法 (Extension Methods)
作用:为现有类型“添砖加瓦”地增加方法,无需继承或修改原类型。
要求:在静态类中写静态方法,首个参数加
this
,指明要扩展的类型。语法:
public static void SpeakValue(this int value) { }
运算符重载
- 关键词:
public static 返回类型 operator 符号(…)
。 - 作用:让自定义类型支持
+
、-
、==
等操作符。 - 注意:必须实现为静态方法;条件运算符需成对;不可使用
ref/out
。
内部类 & 分部类/分部方法
- 内部类:在一个类内部定义另一个类,用于表示紧密关联的类型;访问时
Outer.Inner
。 - 分部类:
partial class
,同一类型可分散声明于多个文件,访问修饰符一致,成员不重复。 - 分部方法:
partial void MethodName();
与其实现分离,只能void
、无访问修饰符,局限性大。
继承
继承基本规则
概念:子类可继承父类所有公共与受保护成员(字段、方法、属性)。
语法:
class Sub : Base { … }
特点:
- 单根性:只能继承一个直接父类。
- 传递性:可链式继承祖先类的成员。
访问修饰符影响:
public
→ 内外皆可访问protected
→ 自身及子类可访问private
→ 仅自身可访问internal
→ 同程序集可访问
示例:
class Teacher { protected int id; public void Speak(){} } class Lecturer : Teacher { public void Teach(){} } class SeniorLecturer : Lecturer { /* 可直接用 id/Speak/Teach */ }
继承中的构造函数
执行顺序:
- 最远祖先类(顶级父类)无参 / 指定构造
- 逐级向下:父类 → 子类 …
base
调用:子类可在构造签名上显式调用父类某个构造:
public Sub(int x) : base(x) { … }
若不显式
base(...)
,则自动调用父类无参构造,故无参构造务必保留或补写。
里氏替换原则 (LSP)
核心:任何父类能出现的地方,子类都可替代。
表现:可用父类类型的变量或容器存放子类实例。
示例:
GameObject obj = new Player(); GameObject[] list = { new Player(), new Monster(), new Boss() };
类型判断与转换 (is
/ as
)
**
is
**:检查对象是否可视为某类型 → 返回bool
。**
as
**:尝试将对象转换为某类型 → 成功返回实例,失败返回null
。示例:
if (obj is Player) (obj as Player).Attack();
万物之父 (object
)
概念:所有类型(值与引用)的基类。
用途:不确定类型时用作参数或容器。
示例:
object o1 = 123; // 装箱 object o2 = "abc"; // 引用 int x = (int)o1; // 拆箱 string s = o2 as string;
装箱与拆箱
- 装箱:将值类型复制到堆上,生成引用类型实例。
- 拆箱:将堆上已装箱的值类型提取回栈。
- 性能:涉及堆→栈/栈→堆复制,频繁使用会有开销。
密封类 (sealed
)
概念:用
sealed
修饰的类,禁止被继承。语法:
sealed class MyClass { … }
作用:确保设计不再被扩展,增强安全与规范。
多态
多态基本概念 (Polymorphism)
- 定义:同一父类引用调用同名方法,执行子类不同实现
- 关键词:
virtual
(基类)、override
(子类)、base
(调用父级逻辑) - 好处:父类容器存放不同子类,调用统一接口即可实现不同表现
抽象类 & 抽象方法
- 抽象类:
abstract class
,不能实例化,可含抽象和虚方法 - 抽象方法:
public abstract void M();
无实现,子类必须override
- 虚方法:
public virtual void M(){}
可选覆写 - 用途:在框架设计中定义“必须由子类实现”的接口模板
接口 (Interface)
本质:纯“行为规范”声明,无字段,仅方法/属性/索引器/事件签名
继承:类可继承多个接口;接口可继承接口
实现:必须公开实现所有成员;支持显示实现解决同名冲突:
void IFirst.M() {…} void ISecond.M() {…}
用途:解耦行为,与类继承并行实现多重职责
密封类 & 密封方法
- 密封类:
sealed class C {}
→ 禁止任何派生 - 密封方法:
public sealed override void M(){}
→ 在覆写后锁定,不再可重写 - 用途:阻止不当继承或覆写,强化安全和稳定性
面向对象关联知识点
命名空间 (Namespace)
作用:组织、分组、避免命名冲突,类似工具包
声明:
namespace MyGame { class A { } } namespace MyGame.UI { class Image { } }
引用:
using MyGame; var o = new GameObject(); // 或显式指定全名 var o2 = new MyGame.GameObject();
同名类:不同命名空间可有同名类,必须
using
+ 命名空间或全名区分嵌套命名空间:
namespace MyGame { namespace UI { class Image { } } } using MyGame.UI;
object
类型核心成员
成员 | 功能 |
---|---|
Equals(a,b) |
静态:按左侧对象逻辑比较相等;实例:可重写自定义相等规则 |
ReferenceEquals |
静态:判断引用是否相同(值类型永 false) |
GetType() |
返回运行时类型 Type ,反射基础 |
MemberwiseClone |
浅拷贝:值类型复制,引用类型仍指向同一对象 |
ToString() |
虚:返回字符串,可重写定义格式;默认打印 Namespace.ClassName |
string
核心方法
- 不可变:每次变更都产生新实例 → 若频繁拼接用
StringBuilder
- 索引访问:
s[i]
- 查找:
IndexOf
,LastIndexOf
- 截取/移除:
Substring
,Remove
- 替换:
Replace
- 分割:
Split
→string[]
- 格式化:
Format("{0}{1}",…)
- 大小写:
ToUpper()
,ToLower()
StringBuilder
(高效可变字符串)
用途:频繁增删改字符时,减少内存分配
容量:
Capacity
自动翻倍扩容;可在构造时指定初始容量常用方法:
Append
/AppendFormat
添加Insert
插入Remove
删除- 索引器
sb[i]
读写 Replace
替换Clear
清空Equals
比较内容
结构体 vs 类
特性 | 结构体 (struct) | 类 (class) |
---|---|---|
类型 | 值类型 | 引用类型 |
存储 | 栈 | 堆 |
继承 | 不能继承,只能实现接口 | 支持继承、多态 |
构造函数 | 不可定义无参;自定义有参不顶掉默认 | 可多重重载,有参顶掉默认需显式补无参 |
成员初始值 | 声明时不可赋初值 | 可赋初值 |
访问修饰符 | 无 protected |
支持全部访问级别 |
静态成员 | 不支持 | 支持 |
自身字段引用 | 不能声明自身类型字段 | 可声明且不必初始化 |
- 选用:数据小且多次复制不影响原值时用结构体;需继承、多态或大型对象用类
抽象类 vs 接口
特性 | 抽象类 (abstract class ) |
接口 (interface ) |
---|---|---|
实例化 | ❌ | ❌ |
成员变量 | ✅ | ❌ |
构造函数 | ✅ | ❌ |
多继承 | 不支持(单继承) | 支持(可继承多接口) |
方法实现 | 可含抽象方法 & 虚方法 & 普通方法 | 仅声明,无实现 |
访问修饰符 | 支持全等级 | 默认 public ,不建议写其他 |
何时用 | 表示对象抽象,共享字段+方法→子类实现 | 表示行为规范,可混入多功能 |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com