4.6 KiB
4.6 KiB
内部类
概念: 也叫==嵌套类== 就是把一个类写在另一个类的内部 本质上它还是类,所以仍然是值类型和引用类型
通常用法: 1. 给外部类当“小零件”用,不想单独暴露出去 2. 把关系很紧密的类型写在一起,减少命名污染 3. 配合成员变量和访问修饰符控制谁能访问
语法:
class Outer
{
public class Inner
{
}
}
案例:
class Person
{
private string name = "小明";
public class Pet
{
public void LookOwner(Person p)
{
cw(p.name);
}
}
}
Person p = new Person();
Person.Pet pet = new Person.Pet();
pet.LookOwner(p); //输出 小明
↑ Pet 是 Person 的内部类,所以外部使用时一般写成 Person.Pet
注意:
- 更规范的说法一般是==嵌套类(nested class)==
- ==类中的内部类如果不写访问修饰符,默认是private==
- 外部访问时通常写
外部类名.内部类名 - ==C# 的内部类不会自动绑定外部类对象==,想访问外部对象的数据,一般要把外部类对象传进去
- 内部类主要是为了==封装和组织代码==,不是继承
分部类
概念:
在C#里更常见的叫法是==分部类==
用 partial 关键字把==同一个类拆到多个文件或多个位置==
编译时会把这些内容==合并成同一个类==
通常用法: 1. 一个类太长了,拆开写更清楚 2. 自动生成代码和手写逻辑分开 3. 多人协作时减少都挤在一个文件里的冲突
语法:
public partial class Player
{
}
在另一个文件里也可以继续写:
public partial class Player
{
}
案例:
//Player_Base.cs
public partial class Player
{
public string name;
public void Move()
{
cw("移动");
}
}
//Player_Fight.cs
public partial class Player
{
public int atk;
public void Attack()
{
cw("攻击");
}
}
Player p = new Player();
p.Move();
p.Attack();
cw(p.atk);
↑虽然写在两个文件里,但编译后它们还是==同一个 Player 类==
注意:
- ==每一部分都要写
partial==,少一处都不行 - 一般要保证它们是==同名、同命名空间==的一组类型
- 分部类是==编译时合并==,不是继承,也不是复制出多个类
- 很适合配合工具自动生成代码,比如“工具生成一部分,自己手写一部分”
partial不只类能用,结构体和接口也能用,但这节先记类- 不要为了拆而拆,拆太碎反而更难找代码
分部方法
概念:
分部方法就是写在==分部类==中的特殊方法
也是用 partial 关键字声明
一般是一边先声明“这里留个钩子”,另一边再决定要不要实现
通常用法: 1. 给自动生成代码留扩展点 2. 把“框架流程”和“自定义逻辑”拆开 3. 某些逻辑可选,有需要时再补实现
语法: 先声明:
partial void OnCreated();
再在同一个分部类型的另一部分里实现:
partial void OnCreated()
{
cw("创建完成");
}
案例:
//Player_Base.cs
public partial class Player
{
public Player()
{
OnCreated();
}
partial void OnCreated();
}
//Player_Extend.cs
public partial class Player
{
partial void OnCreated()
{
cw("玩家初始化完成");
}
}
↑ 这种写法很适合“主逻辑在自动生成文件里,扩展逻辑在自己文件里”
注意:
- ==分部方法只能写在分部类型里==,普通类里不能单独这么用
- 它本质上是“声明部分”和“实现部分”配对
- 如果只是最经典那种可选分部方法,一般写法是==没有访问修饰符、返回
void、不能有out参数== - 这种“可选分部方法”如果没写实现,==编译器会把声明和调用一起移除==
- ==如果你给它加了访问修饰符,或者返回值不是
void,通常就不能再省略实现== - 所以记忆上可以理解成:简单钩子可以不实现,复杂正式方法通常必须实现
引用:
- Microsoft Learn: Nested types (C# Programming Guide)
- Microsoft Learn: Partial Classes and Members (C# Programming Guide)
- Microsoft Learn: partial type (C# Reference)
- Microsoft Learn: Partial member (C# Reference)
#封装 #核心