项目地址
dbt
airflow
一、扩展方法(Extension Methods)
1.1 创建扩展方法
- 全部使用static
- 需要扩展的语法:
this + 被扩展类型 + 参数

1.2 案例
- 最常用的案例就是:给类库添加依赖注入
- The most common use case involves adding dependency injection to a library.
- The most typical example is adding dependency injection to a library.

二、访问修饰符
2.1 顶级类
- public :可以被任何项目中的任何代码访问。
- internal :只能在同一个程序集中访问(类库)
2.2 类中成员(字段、属性、方法)
修饰符 | 说明 |
---|
public | 对所有人可见。 |
private | 仅在类内部可见(默认值)。 |
protected | 在该类和派生类中可见。 |
internal | 在同一程序集内可见。 |
protected internal | 当前程序集或任何派生类中可见。 |
private protected | 当前程序集中的派生类可见。 |
2.3 internal
- internal 默认是不能被其他的程序集访问的(By default, ‘internal’ members are not accessible from other assemblies.)
- 但是,如果我们的测试类,需要引用其他程序集的internal, 有两种方法
1. 在AssemblyInfo.cs里
- 允许名为 MyApp.Tests 的程序集访问我当前程序集中的 internal 成员
assembly: InternalsVisibleTo("MyApp.Tests")]
2. 在.csproj中添加
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>MyApp.Tests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
三、接口和抽象
特性 | 接口(interface ) | 抽象类(abstract class ) |
---|
是否可以实现方法 | 可以(从 C# 8.0 开始支持默认实现) | 可以(包括抽象方法和具体方法) |
是否可以包含字段 | ❌ 不可以 | ✅ 可以 |
是否可以有构造函数 | ❌ 不可以 | ✅ 可以 |
是否可以继承多个 | ✅ 支持多接口继承 | ❌ 只能继承一个抽象类(但可实现多个接口) |
是否可以包含访问修饰符 | ❌ 全部都是 public (隐式) | ✅ 可以使用 public /protected /private |
是否可以包含属性和事件 | ✅ 支持属性、事件(无字段) | ✅ 支持属性、事件和字段 |
适合用于 | 定义能力或行为规范 | 提供基础实现和状态 |
四、协变/逆变
4.1 概念

4.2 应用
协变: 集合处理,IEnumerable 的协变特性使得可以统一处理不同派生类型的集合
逆变: 事件处理,使得基类事件处理器可以处理派生类事件
五、生命周期
