【问题标题】:ToString on null string空字符串上的 ToString
【发布时间】:2011-06-15 04:22:53
【问题描述】:

为什么第二个会产生异常而第一个不会?

string s = null;
MessageBox.Show(s);
MessageBox.Show(s.ToString());

更新 - 我能理解的异常,(对我来说)令人费解的一点是为什么第一部分没有显示异常。这与 Messagebox 无关,如下图所示。

例如:

string s = null, msg;
msg = "Message is " + s; //no error
msg = "Message is " + s.ToString(); //error

第一部分似乎是将 null 隐式转换为空白字符串。

【问题讨论】:

  • 为了避免null 损坏字符串或对象,obj?.ToString() ?? ""
  • 对于第二行,发生错误是因为您在空字符串引用上调用方法 (.ToString())。这就是您得到异常的原因。

标签: c# string exception null tostring


【解决方案1】:

因为您不能在 null 引用上调用实例方法 ToString()

MessageBox.Show() 可能被实现为忽略 null 并打印出空消息框。

【讨论】:

  • 第一位很好,但我认为我的问题的 MessageBox 位会分散注意力,因此我的更新。
【解决方案2】:

因为 MessageBox.Show() 是用 pinvoke 实现的,所以它调用了原生的 Windows MessageBox() 函数。这不介意为 lpText 参数获取 NULL 。 C# 语言对纯 .NET 实例方法(如 ToString)有更严格的规则,它总是发出代码来验证对象不为空。在blog post 中有一些背景信息。

【讨论】:

    【解决方案3】:

    由于这个问题在 Google 上搜索“c# toString null”的排名很高,我想补充一点,Convert.ToString(null) 方法将返回 an empty 一个空字符串,它会被忽略通过消息框。

    但是,为了再次确认其他答案,您可以在此示例中使用 string.Concat("string", null)

    编辑 - 根据 HeyJude 下面的评论修改答案。正如所指出的,像Convert.ToString(null).Length 这样的方法会抛出异常。

    【讨论】:

    • Convert.ToString(null) 返回一个空值,而不是一个空字符串(这可以通过调用Convert.ToString(null) == null 来验证,它返回true)。然而,传递一个空的变量确实等于空,所以object v = null; Convert.ToString(v) == string.Empty返回真(见answer)。
    • @HeyJude - 很好,谢谢!我会相应地更新。
    【解决方案4】:

    在您的后续问题/更新例如调用 concat 的幕后

    string snull = null;
    
    string msg = "hello" + snull;
    
    // is equivalent to the line below and concat handles the null string for you.
    string msg = String.Concat("hello", snull);
    
    // second example fails because of the toString on the null object
    string msg = String.Concat("hello", snull.ToString());
    
    //String.Format, String.Convert, String.Concat all handle null objects nicely.
    

    【讨论】:

    • 你能告诉我们这个幕后吗,因为我肯定在 mscorlib 中找不到它...
    • 所以你的意思是字符串实用方法只是将它转换为'null'字符串如果返回的值为空?
    • @RobertKoritnik 在编译后的示例代码上使用 ildasm.exe,你会看到 James 写了什么。
    • 很抱歉,当你有可以为空的整数时,这是黄金。你可以写字符串 s = "" + myInt;谢谢,6 年后!
    【解决方案5】:

    您正在尝试对 null 执行 ToString() 方法。您需要一个有效的对象才能执行方法。

    【讨论】:

      【解决方案6】:

      .show 函数必须进行空值检查并进行处理。

      【讨论】:

      • 正如其他人所说,引发异常是因为在空引用上调用了方法。
      • 确实如此。这是显而易见的部分。
      【解决方案7】:

      因为,第二次调用期望“s”对象满足 ToString() 方法请求。因此,在调用 .Show() 之前, s.ToString() 会因尝试调用方法而失败。

      有趣的是,虽然 .Show() 被正确实现,但许多此类方法都希望传入非空实例。通常,当您使用 NullObject 模式时,调用者不必处理此类的行为。

      【讨论】:

        【解决方案8】:

        可能 Show 方法处理一个空值并且什么也不显示。 s - s.ToString() 的第二次使用失败,因为您没有要运行的 ToString 方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-11
          • 2016-12-13
          • 2010-10-15
          • 1970-01-01
          • 2013-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多