C# 空安全字符串

C# 空安全字符串,c#,.net-core,C#,.net Core,我有一个localization字符串,如果设置为null,显然会导致视图中出现问题。所以我的解决办法是把它串起来 _localizer["Controller_Account_ResetPassword_ResetFailed"].ToString(); 在代码检查期间,我的同事提醒我.ToString()不是空安全的。虽然本地化不太可能是空的,但我想它可能是空的。他建议如下 TempData["Message"] = $"{_localizer["Controller_Account_Re

我有一个localization字符串,如果设置为null,显然会导致视图中出现问题。所以我的解决办法是把它串起来

_localizer["Controller_Account_ResetPassword_ResetFailed"].ToString();
在代码检查期间,我的同事提醒我.ToString()不是空安全的。虽然本地化不太可能是空的,但我想它可能是空的。他建议如下

TempData["Message"] = $"{_localizer["Controller_Account_ResetPassword_ResetFailed"]}";
我有两个问题

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

  • 首先,原因是它基本上被反编译为

    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
    纯粹是口味问题,所以。