C#中如何正确创建带条件判断的模板字符串?
C# 可空字符串拼接实现优化
原有代码问题
你当前的写法存在两个逻辑bug,不符合预期规则:
- C# 中
null与字符串执行+拼接运算时,null会被隐式转换为空字符串"",因此SomeClass?.Str1 + " "在Str1为null时,运算结果是单独的空格" ",不是null,后续的?? string.Empty不会生效,会导致最终结果出现多余的前置空格。 - 同理
"(" + SomeClass?.Str2 + ")"在Str2为null时,运算结果是"()",不是null,会输出无内容的空括号,不满足两个变量均为null时返回空字符串的要求。
推荐实现
最符合C#编码规范、可读性最高的写法是直接对应你定义的4条规则做分支判断,避免隐式转换带来的不可预期问题。
如果使用C# 8及以上版本,推荐用元组模式匹配的switch表达式,逻辑和规则一一对应,一眼就能看懂:
// 提前取值,避免重复访问SomeClass属性 string? str1 = SomeClass?.Str1; string? str2 = SomeClass?.Str2; // 若业务中视空字符串为无有效值用IsNullOrEmpty,视全空格空白字符串为无有效值则替换为IsNullOrWhiteSpace bool hasStr1 = !string.IsNullOrEmpty(str1); bool hasStr2 = !string.IsNullOrEmpty(str2); string result = (hasStr1, hasStr2) switch { (true, true) => $"{str1} ({str2})", (true, false) => str1!, (false, true) => $"({str2})", _ => string.Empty };
如果使用低于C# 8的版本,可以用普通if分支实现,逻辑完全一致:
string? str1 = SomeClass?.Str1; string? str2 = SomeClass?.Str2; bool hasStr1 = !string.IsNullOrEmpty(str1); bool hasStr2 = !string.IsNullOrEmpty(str2); string result; if (hasStr1 && hasStr2) { result = $"{str1} ({str2})"; } else if (hasStr1) { result = str1!; } else if (hasStr2) { result = $"({str2})"; } else { result = string.Empty; }
写法说明
- 提前取出
Str1和Str2的值,避免多次判断SomeClass是否为null、重复访问属性,代码更简洁。 - 用
string.IsNullOrEmpty(或string.IsNullOrWhiteSpace)显式判断字符串是否有有效值,完全规避字符串和null拼接的隐式转换坑。 - 分支和你定义的4条规则完全对应,后续维护时不需要推导隐式逻辑,调整规则时直接修改对应分支即可。
内容的提问来源于stack exchange,提问作者Rinkashikachi
相关产品推荐
相关产品推荐

