You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:51:22