You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#如何简化多链式空值检查?RimWorld模组开发问题

Cleaner Null Handling for Your RimWorld Mod Code

Hey fellow RimWorld modder! I feel your pain dealing with those nested null checks when you can't touch the core Pawn code. Let's look at some cleaner ways to handle those potential nulls without losing readability:

1. Simplify Early Exit with the Null Conditional Operator (?.)

Instead of checking each property individually, you can chain the null conditional operator to collapse that long if statement into a single check. This operator safely short-circuits and returns null as soon as any link in the chain is null:

private void cleanseParadoxicalMemories(Pawn pawn, Dictionary<string, string> knownPawnIDs) {
    // Short-circuit if any nested property is null
    if (pawn.needs?.mood?.thoughts?.memories == null) {
        return;
    }

    foreach (var paradox in pawn.needs.mood.thoughts.memories.Memories.ToList()) {
        if (paradox.otherPawn != null) {
            pawn.needs.mood.thoughts.memories.RemoveMemory(paradox);
        }
    }
}

2. Extract the Nested Object to Avoid Repetition

If you don't want to repeat the long property chain later in the method, you can extract the memories object first using ?. and a simple null check. This makes the rest of your code cleaner and reduces the chance of typos:

private void cleanseParadoxicalMemories(Pawn pawn, Dictionary<string, string> knownPawnIDs) {
    var memories = pawn.needs?.mood?.thoughts?.memories;
    if (memories == null) {
        return;
    }

    foreach (var paradox in memories.Memories.ToList()) {
        if (paradox.otherPawn != null) {
            memories.RemoveMemory(paradox);
        }
    }
}

3. Pattern Matching (C# 8.0+) for One-Line Extraction & Check

If you're using C# 8.0 or newer (which RimWorld's modding environment should support these days), you can use pattern matching to combine the extraction and null check into a single line. The {} pattern matches any non-null object:

private void cleanseParadoxicalMemories(Pawn pawn, Dictionary<string, string> knownPawnIDs) {
    // Extract memories only if the entire chain is non-null
    if (!(pawn.needs?.mood?.thoughts?.memories is {} memories)) {
        return;
    }

    foreach (var paradox in memories.Memories.ToList()) {
        if (paradox.otherPawn != null) {
            memories.RemoveMemory(paradox);
        }
    }
}

Quick Note for RimWorld Modding

All these approaches keep your original logic intact—they just make the null checks less verbose. Since RimWorld's pawns can have null properties in edge cases (like newly spawned pawns or special pawn types), exiting early is still the right call here. None of these solutions require modifying the core Pawn code, which fits perfectly with your modding constraints.

内容的提问来源于stack exchange,提问作者Theodore R. Smith

火山引擎 最新活动