---
sidebar: false
---
⬅ 返回
# ⚡ C# 核心语法
---
这不是一篇“C# 入门”,而是 **专门为《缺氧(ONI)》Mod 开发提炼的最小语法集**。
> 🎯 阅读目标:
>
> * 能**直接看懂 ONI 源码**
> * 能**独立写 Harmony Patch**
> * 知道哪些语法是“必须会”,哪些可以先无视
---
## 🧠 总览
> **ONI Mod 的 C# 本质只有四件事:**
>
> 1️⃣ 类 + 组件
> 2️⃣ static + ref
> 3️⃣ 数组 + 泛型
> 4️⃣ null 判断
下面所有内容,都是在为这四点服务。
---
## 🧱 一、class 是一切的起点
### 你在 ONI 里只会写这三种类
```csharp
public class XXXConfig : IBuildingConfig {}
public class XXXPatch {}
public class XXXComponent : KMonoBehaviour {}
```
结论:
* **类必须是 `public`**
* 不要纠结面向对象
---
## 🔧 二、static:为什么 Patch 必须是 static
### 普通方法(ONI 几乎不用)
```csharp
public void DoSomething() {}
```
### Patch 方法(必须这样)
```csharp
public static void Postfix() {}
```
原因一句话解释:
> Harmony **不会 new 你的类**,只能调用静态方法。
👉 **Patch 写错 90% 都是这里的问题**
---
## 🧬 三、ref:为什么 ONI Patch 能“改游戏”
### 没有 ref(改不到)
```csharp
public static void Postfix(BuildingDef def)
{
def.EnergyConsumptionWhenActive = 1f; // ❌ 无效
}
```
### 有 ref(直接改内存)
```csharp
public static void Postfix(ref BuildingDef __result)
{
__result.EnergyConsumptionWhenActive = 1f; // ✅ 生效
}
```
一句话结论:
> **Harmony 能改游戏,全靠 ref。**
---
## 📦 四、组件思维:ONI ≈ Unity
### 所有功能 = 组件
```csharp
go.AddOrGet();
go.AddOrGet();
```
### AddOrGet 的真实含义
```text
有 → 拿
无 → 加
```
> ❗ ONI 世界里
>
> * **没有组件 = 没有功能**
---
## 🔍 五、泛型 ``:不要怕,它只是“占位”
### 看到下面这两行,直接翻译成中文
```csharp
go.AddOrGet();
go.GetComponent();
```
翻译:
> “我要 **ElementConverter** 这个组件”
> `` = 类型占位符,仅此而已
---
## 🚧 六、null 判断:ONI Mod 的生命线
### 正确写法
```csharp
var converter = go.GetComponent();
if (converter == null)
return;
```
原因一句话:
> Patch 执行顺序不固定,**组件不一定存在**。
👉 **不写 null 判断 = 随机崩溃**
---