【问题标题】:Checking for null before ToString()在 ToString() 之前检查 null
【发布时间】:2010-10-07 17:08:35
【问题描述】:

这里是场景......

if (entry.Properties["something"].Value != null)
  attribs.something = entry.Properties["something"].Value.ToString();

虽然有效且工作正常,但对我来说这看起来很难看。如果我在执行 ToString() 之前不检查 null,那么如果属性为 null,它会引发异常。有没有更好的方法来处理这种情况?

非常感谢!

【问题讨论】:

  • 那么,如果值为null,输出应该是什么?
  • 它将使用分配给 attribs.something 的默认值
  • @dscoduc 我正在寻找你从 2009 年开始的 HTA jQuery 信息。现在还在吗?您的博客和网站似乎处于离线状态。
  • 我的问题是 2009 年的,而您提到的问题是 2010 年的……所以另一个是我的副本,不是吗?

标签: c# .net string properties


【解决方案1】:

8 年后更新(哇!)以覆盖 c# 6's null-conditional operator

var value = maybeNull?.ToString() ?? String.Empty;

其他方法:

object defaultValue = "default";
attribs.something = (entry.Properties["something"].Value ?? defaultValue).ToString()

这个我也用过,不是很聪明但是很方便:

public static string ToSafeString(this object obj)
{
    return (obj ?? string.Empty).ToString();
}

【讨论】:

  • 你知道“默认”是否可以替换为 string.Empty 吗?
  • +1 和回答:刚刚测试过,效果很好……谢谢!
  • 请注意,如果进行调用的方法运行不止一次并且属性被重用,那么您可能会在后续调用中用“默认”覆盖在 1 次调用中获得的有效数据。
  • @xcud:是的。在这种情况下,他应该使用以下代码:attribs.something = (entry.Properties["something"].Value ?? (objcet)attribs.something).ToString();
【解决方案2】:

在 C# 6.0 中,您可以以一种非常优雅的方式做到这一点:

attribs.something = entry.Properties["something"].Value?.ToString();

还有一篇关于新null-conditional operator的文章。

【讨论】:

    【解决方案3】:

    向对象添加空字符串是一种常见的习惯用法,可让您进行空安全ToString 转换,如下所示:

    attribs.something = ""+entry.Properties["something"].Value;
    

    entry.Properties["something"].Valuenull 时,这会悄悄地返回一个空的string

    编辑:从 C# 6 开始,您可以使用 ?. 运算符来避免 null 以更简单的方式检查:

    attribs.something = entry.Properties["something"].Value?.ToString();
    //                                                     ^^
    

    【讨论】:

    • 这比怪异的 Convert.ToString 调用更简洁。
    • @thepaulpage 在 C# 6 中有一个更好的方法。
    【解决方案4】:
    Convert.ToString(entry.Properties["something"].Value);
    

    【讨论】:

    • 40-Love - 不,如果值为 null,则返回 null 而不是空字符串。
    • @ChrisPeacock 否,请查看文档:Convert.ToString(object value) 的返回值是“'value' 的值的字符串表示形式,如果值为 null,则为 String.Empty” .快速检查实际程序可以证实这一点。
    【解决方案5】:
    attribs.something  = string.Format("{0}",entry.Properties["something"].Value)
    

    【讨论】:

      【解决方案6】:

      有没有可能做类似的事情 Dale Ragan's answer above,但是覆盖 ToString() 而不是创建新的 NullSafeToString() 方法?我希望这(或返回“null”)成为默认行为。当我将以下方法添加到公共静态类 ObjectExtensions 时,编译器(Visual C# 2010 Express)没有报错,但该方法没有被调用...

      public static String ToString(this Object obj)
      {
          if (obj == null)
          {
              return "null";
          }
          else
          {
              return obj.GetType().Name;
          }
      }
      

      【讨论】:

      • 可以,因为实例方法的优先级高于扩展方法
      【解决方案7】:
      attribs.something = String.Format("{0}", entry.Properties["something"].Value);
      

      虽然不确定性能...

      【讨论】:

        【解决方案8】:

        你可以不做吗:

        attribs.something = entry.Properties["something"].Value as string;
        

        【讨论】:

        • 不,你不能;如果它是'null',你会得到一个空引用错误。
        • 之所以有效,是因为如果值为空,它会返回空字符串,并且不会抛出异常。
        • 这不适用于值类型。 '字符串 str = myFloat 作为字符串;'失败。您将收到以下编译器错误无法通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换将类型“浮点”转换为“字符串”
        • Nooooo,如果类型不是字符串,将始终返回 null !!!这是铸造而不是转换!并且不适用于表单值类型!
        【解决方案9】:

        要精确地做你想做的事,总是可以使用辅助方法:

        CopyIfNotNull(entry.Properties["something"].Value, out attribs.something);
        
        void CopyIfNotNull(string src, out string dest)
        {
          if(src != null)
            dest = src;
        }
        

        【讨论】:

        • 您不必在 CopyIfNotNull 的第二个参数中指定“out”吗?
        • 是的。我发帖后才意识到。
        【解决方案10】:

        如果您的目标是 .NET Framework 3.5,我认为最优雅的解决方案是扩展方法。

        public static class ObjectExtensions
        {
            public static string NullSafeToString(this object obj)
            {
                return obj != null ? obj.ToString() : String.Empty;
            }
        }
        

        然后使用:

        attribs.something = entry.Properties["something"].Value.NullSafeToString();
        

        【讨论】:

        • 美丽。我正面临从 1.1 到 4.0 的转换,而在 1.1 中,null.ToString() 实际上返回了“”,所以我现在有几千次出现来检查 null 安全性。如果我让它发挥作用,这将使过渡更加顺利!
        • 哇,这为我节省了很多时间!谢谢!
        【解决方案11】:

        作为 RexM 答案的变体:

        attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString()
        

        唯一的缺点是即使 entry.Properties["something"].Value 为 null,attribs.something 也会被分配一个值(在本例中是它本身) - 如果 .something 属性确实如此,这可能会很昂贵其他一些处理和/或这条线执行了很多(比如在循环中)。

        【讨论】:

          【解决方案12】:

          使用这样的辅助方法怎么样:

          attribs.something = getString(
              entry.Properties["something"].Value, 
              attribs.something);
          
          static String getString(
              Object obj,
              String defaultString)
          {
              if (obj == null) return defaultString;
              return obj.ToString();
          }
          

          或者,您可以使用?? 运算符:

          attribs.something = 
              (entry.Properties["something"].Value ?? attribs.something).ToString();
          

          (注意当值为null时多余的ToString()调用)

          【讨论】:

            猜你喜欢
            • 2010-12-27
            • 1970-01-01
            • 1970-01-01
            • 2010-10-09
            • 1970-01-01
            • 2022-12-18
            • 1970-01-01
            • 1970-01-01
            • 2010-09-21
            相关资源
            最近更新 更多