--- 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 判断 = 随机崩溃** ---