C# 空安全字符串
我有一个localization字符串,如果设置为null,显然会导致视图中出现问题。所以我的解决办法是把它串起来C# 空安全字符串,c#,.net-core,C#,.net Core,我有一个localization字符串,如果设置为null,显然会导致视图中出现问题。所以我的解决办法是把它串起来 _localizer["Controller_Account_ResetPassword_ResetFailed"].ToString(); 在代码检查期间,我的同事提醒我.ToString()不是空安全的。虽然本地化不太可能是空的,但我想它可能是空的。他建议如下 TempData["Message"] = $"{_localizer["Controller_Account_Re
_localizer["Controller_Account_ResetPassword_ResetFailed"].ToString();
在代码检查期间,我的同事提醒我.ToString()不是空安全的。虽然本地化不太可能是空的,但我想它可能是空的。他建议如下
TempData["Message"] = $"{_localizer["Controller_Account_ResetPassword_ResetFailed"]}";
我有两个问题
首先,原因是它基本上被反编译为
var arg = _localizer["Controller_Account_ResetPassword_ResetFailed"];
string.Format("{0}", arg);
和string.Format
其次,这个解决方案很漂亮,字符串插值是一个巧妙的工具。您应该使用它:)
编辑:
我有点忽略了一个事实,这里字符串插值仅用于修复null
问题。正如一些人指出的那样,这是不必要的,而且每个人都应该喜欢这样的字符串插值:
_localizer["Controller_Account_ResetPassword_ResetFailed"]?.ToString() ?? "";
这将是一个更好的选择。对于此类场景,我喜欢使用ToString安全扩展方法
public static class Extensions
{
public static string ToStringSafe(this object value)
{
// return empty string
if (value == null) {
return String.Empty;
}
return value.ToString();
}
}
如果需要,您可以使用
?
运算符替换“”
:
var something = _localizer["Controller_Account_ResetPassword_ResetFailed"] ?? "";
我不会在这里使用$“{value}”
符号。首先,它可能是不需要的,其次,它通过调用string.Format()
在内部创建StringBuilder
对象来做额外的工作
调用
$“{value}”
的唯一和实际原因是处理一个潜在的空值,这一点也并不清楚,当您使用??
时,它是100%清楚的,正如上面所述,字符串插值是空安全的,因为它在内部转换为string.Format。然而,要回答第二个问题,需要了解如何处理带有空本地化的罕见情况。您的同事建议的解决方案是好的(为了更好的可读性,我只建议提取变量而不是内联),但是您可能希望返回到消息的非本地化版本,而不是在缺少本地化的情况下获取空字符串,或者以任何其他方式处理这种情况。在这种情况下,您可能必须在_本地化器类型实现中执行显式的空验证,以便始终保证返回非空值或失败。(2)x+“
是最简洁的方法。当然,您可以执行?.ToString()??“”
以及自定义扩展方法。仅为此使用插值字符串是丑陋的,应该避免。您将得到一个错误,因为var不知道它是什么类型。将?.ToString()添加到本地化程序。问题从开始,我有一个本地化字符串
,从中我假设\u本地化程序
是传递字符串的东西(例如字典)嗯,我想你可能是对的。似乎OP使用ToString()作为处理空值的方法,不是因为它不是字符串。唯一的答案实际上回答了为什么插值是空安全的问题。别误会,我喜欢插值,只是以这种方式使用它(一个变量本身)很奇怪。我想我只是把它当作字符串连接使用的东西。然而,在这种情况下,我们实际上并没有连接任何东西。我编辑了我的帖子,以反映这样一个事实,即在这种情况下,字符串插值可能是矫枉过正的。_localizer[“Controller\u Account\u ResetPassword\u ResetFailed”??字符串。空string.Empty
vs“
纯粹是口味问题,所以。