我有一个本地化字符串,如果将其设置为null,显然会在视图中引起问题。所以我的解决方案是将它串起来。
_localizer["Controller_Account_ResetPassword_ResetFailed"].ToString();
在代码审查期间,我的同事提醒我说.ToString()不是null安全的。虽然本地化不太可能为空,但我猜可能会为空。他提出了以下建议。
TempData["Message"] = $"{_localizer["Controller_Account_ResetPassword_ResetFailed"]}";
我有两个问题。
答案 0 :(得分:7)
首先,原因是它基本上被反编译为
var arg = _localizer["Controller_Account_ResetPassword_ResetFailed"];
string.Format("{0}", arg);
和string.Format
does a null
check on its arguments and automatically replaces them with string.Empty
。
第二,此解决方案非常漂亮,字符串插值是一种巧妙的工具。您应该使用它:)
编辑:
我有点忽略了一个事实,在这里字符串内插仅被用于解决null
问题。正如一些人指出的那样,这是不必要的,每个人都应该喜欢这样的字符串插值:
_localizer["Controller_Account_ResetPassword_ResetFailed"]?.ToString() ?? "";
将是一个更好的选择。
答案 1 :(得分:2)
在这种情况下,我喜欢使用ToStringSafe扩展方法
public static class Extensions
{
public static string ToStringSafe(this object value)
{
// return empty string
if (value == null) {
return String.Empty;
}
return value.ToString();
}
}
答案 2 :(得分:1)
如果需要,可以使用??
运算符替换""
:
var something = _localizer["Controller_Account_ResetPassword_ResetFailed"] ?? "";
在这里我不会使用$"{value}"
表示法。首先,它可能是不需要的,其次,它通过调用string.Format()
来做额外的工作,StringBuilder
在内部创建了一个$"{value}"
对象。
也完全不清楚,调用??
的唯一实际原因是处理潜在的空值,当您使用{{ 1}}。
答案 3 :(得分:0)
如上所述,字符串内插是内部安全的,因为它是内部转换为string.Format的。但是,要回答第二个问题,则需要有关如何处理空定位的罕见情况的信息。同事建议的解决方案很好(我只建议提取变量而不是内联以提高可读性),但是您可能希望回退到消息的非本地化版本,而不是获取空字符串,以防万一缺少本地化或以其他任何方式处理情况。在这种情况下,您可能必须在_localizer类型实现内进行显式的null验证,以便始终保证它返回非null值或失败。