none
新人阅读源码发现的问题--string.join中为何有value != null的判断? RRS feed

  • 问题

  • public static String Join(String separator, params Object[] values) {
                if (values==null)
                    throw new ArgumentNullException("values");
                Contract.EndContractBlock();
    
                if (values.Length == 0 || values[0] == null)
                    return String.Empty;
    
                if (separator == null)
                    separator = String.Empty;
    
                StringBuilder result = StringBuilderCache.Acquire();
                
    
                //注意下列三行
                //这里什么情况下会得到null的值?
                String value = values[0].ToString();           
                if (value != null)
                    result.Append(value);
    
    
    
                for (int i = 1; i < values.Length; i++) {
                    result.Append(separator);
                    if (values[i] != null) {
                        // handle the case where their ToString() override is broken
                        value = values[i].ToString();
                        if (value != null)
                            result.Append(value);
                    }
                }
                return StringBuilderCache.GetStringAndRelease(result);
            }
    还是说这里没有参数null异常的设定?实在没有搞懂,求指教,非常感谢!
    2017年11月22日 7:37

答案

  • Hi,

    >>他是会抛出异常的,抛出异常之后那么下面的代码也就不会被执行,判断[value != null]的意义又在哪里呢

    这句话说的特别好,他会抛出异常,他抛出异常,程序员就知道这个地方出错了,我们能很快定位问题在这,如果它这个地方没有抛出异常,你的程序崩溃了在这? 我们怎么能快速知道事发地点?

    一般写程序对于引用的变量都会加以判断是不是null 是不是空, 这些是为了提高程序的健壮性,能应付更多的复杂情况。

    如果你这个地方不判断,万一为NULL,程序就崩溃, 如果数组里面存放的就是null值,那不就出错了嘛?

    如果你的问题解决了,请及时标记有用的回复作为答案,这样会帮助遇到相同问题的人。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年11月23日 7:28
    版主
  • // handle the case where their ToString() override is broken

    你不是自己已经把解释贴出来了吗?ToString是虚函数,所以毫无疑问要对其返回值进行判断。

    2017年11月23日 11:07

全部回复

  • Hi xiaoxiaotank,

    感谢你在MSDN论坛发帖。

    判断string 类型是否是NULL,这是一种写代码的健壮性的一个判断,因为string 类型是完全有可能为NULL的,所以这个判断就出现了。

    >> //这里什么情况下会得到null的值?

    据我所知,C#里面是可以直接赋值null值给一个string 变量的。是null值,就代表没有赋值。下面的代码就是null值。

    using System;
    
    public class Example
    {
       public static void Main()
       {
          String s = null;
    
          Console.WriteLine("The value of the string is '{0}'", s);
    
          try {
             Console.WriteLine("String length is {0}", s.Length);
          }
          catch (NullReferenceException e) {
             Console.WriteLine(e.Message);
          }
       }
    }
    

    • 注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年11月23日 2:50
    版主
  • 非常感谢您的答复,不过我还有一些疑点:

    String value = values[0].ToString();           
    if (value != null)
         result.Append(value);

    对于上述代码,[value]的值是通过[values[0].ToString()]得到的,可是我实在没有找到何种情况下进行ToString()能够得到null值,因为正如您的示例代码,他是会抛出异常的,抛出异常之后那么下面的代码也就不会被执行,判断[value != null]的意义又在哪里呢?

    我也相信编写源码的大牛这样写肯定有他的缘由,希望您不吝赐教,谢谢!

    2017年11月23日 5:17
  • Hi,

    >>他是会抛出异常的,抛出异常之后那么下面的代码也就不会被执行,判断[value != null]的意义又在哪里呢

    这句话说的特别好,他会抛出异常,他抛出异常,程序员就知道这个地方出错了,我们能很快定位问题在这,如果它这个地方没有抛出异常,你的程序崩溃了在这? 我们怎么能快速知道事发地点?

    一般写程序对于引用的变量都会加以判断是不是null 是不是空, 这些是为了提高程序的健壮性,能应付更多的复杂情况。

    如果你这个地方不判断,万一为NULL,程序就崩溃, 如果数组里面存放的就是null值,那不就出错了嘛?

    如果你的问题解决了,请及时标记有用的回复作为答案,这样会帮助遇到相同问题的人。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年11月23日 7:28
    版主
  • // handle the case where their ToString() override is broken

    你不是自己已经把解释贴出来了吗?ToString是虚函数,所以毫无疑问要对其返回值进行判断。

    2017年11月23日 11:07
  • 的确是,您的回答让我眼前一亮,由于ToString可以被重载,很有可能出现返回值为null的情况,很感谢!
    2017年11月24日 0:33