空安全字符串

时间:2018-08-23 08:25:54

标签: c# .net-core

我有一个本地化字符串,如果将其设置为null,显然会在视图中引起问题。所以我的解决方案是将它串起来。

_localizer["Controller_Account_ResetPassword_ResetFailed"].ToString();

在代码审查期间,我的同事提醒我说.ToString()不是null安全的。虽然本地化不太可能为空,但我猜可能会为空。他提出了以下建议。

TempData["Message"] = $"{_localizer["Controller_Account_ResetPassword_ResetFailed"]}";

我有两个问题。

  1. 为什么$“ {var}”为null安全,而.ToString()不安全。
  2. 有没有更好的方法,因为他的解决方案对我来说很难看。

4 个答案:

答案 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值或失败。