的String.format如何处理空值?(How string.Format handles nu

2019-08-02 10:47发布

在下面的下面的代码,为什么两者string.Format调用不行为相同的方式? 在第一个,则不会抛出异常,但在第二个的ArgumentNullException被抛出。

static void Main(string[] args)
{
    Exception e = null;
    string msgOne = string.Format("An exception occurred: {0}", e);
    string msgTwo = string.Format("Another exception occurred: {0}", null);
}

可能有人请帮助我理解这两者之间的区别?

Answer 1:

我猜在这里,但它看起来是其中的重载叫你打的差别。 String.Format有多个重载,它只是其中你打。

在第一个例子,它将使意义你打String.Format(string,object)

通过提供第二个例子null你最有可能打String.Format(string,params object[])其中,每个文档,将引发ArgumentNullException时:

格式或参数表是空。

如果你正在运行.NET4,请尝试使用命名参数:

String.Format("Another exception occured: {0}", arg0: null);

为什么击中params object[]超载? 大概是因为null是不是对象的方式,以及params工作是你可以在调用通过其中的每个值作为一个新的对象传递给它的值的数组。 也就是说,以下是在同一个 :

String.Format("Hello, {0}! Today is {1}.", "World", "Sunny");
String.Format("Hello, {0}! Today is {1}.", new Object[]{ "World", "Sunny" })

所以,它的翻译你的语句调用的线沿线的东西:

String format = "Another exception occured: {0}";
Object[] args = null;
String.Format(format, args); // throw new ArgumentNullException();


Answer 2:

在你的第一个例子,你打Format(String, Object) ,在拆卸时它看起来像这样:

 public static string Format(string format, object arg0)
 {
    return Format(null, format, new object[] { arg0 });
 }

请注意, new object[]解决这一问题。

第二个,则显然击中Format(string, object[])的使用中,至少是当我执行相同的测试被调用的一个。 拆卸,看起来像这样:

 public static string Format(string format, params object[] args)
 {
     return Format(null, format, args);
 }

因此,所有的这些实际上得到漏斗状,以Format(IFormatProvider, string, object[]) 酷,让我们来看看前几行有:

public static string Format(IFormatProvider provider, string format, params object[] args)
{
    if ((format == null) || (args == null))
    {
        throw new ArgumentNullException((format == null) ? "format" : "args");
    }
...
}

...韦尔普,还有你的问题,就在那里! 首先调用被包裹在一个新的数组,所以它不是空。 在空传递明确不让它做的是,由于具体实例Format()是在呼叫。



Answer 3:

第一呼叫得到解决作为呼叫格式化(对象),而第二个得到解决作为呼叫格式化(对象[])。 空参数通过这些不同的重载不同的处理。

重载分析被描述在这里 。 相关的部分是用于所述第二呼叫,以格式,格式的过载(params对象[])被扩展到格式(对象[]),这是优选的,以格式(对象)。 字面null是二者的对象[]和一个对象,但对象[]是更具体地,以使得选择。



Answer 4:

如果您使用的插值字符串($“”,另一种方式格式),空被忽略,跳过。 所以

string nullString = null;
Console.WriteLine($"This is a '{nullString}' in a string");

会产生:“这是一个字符串‘’”。 当然你也可以使用空合并运算符在零到生产所需的输出的情况下:

string nullString = null;
Console.WriteLine($"This is a '{nullString ?? "nothing"}' in a string");


Answer 5:

还有这是以下两点不同:

  1. 在这里,Null值分配。

     Exception e = null; string msgOne = string.Format("An exception occurred: {0}", e); 
  2. 此处,空值不能以字符串格式,这意味着型铸造错误读取。

     string msgTwo = string.Format("Another exception occurred: {0}", null); 

我给大家简单的例子:在这里,您无法读取NULL值作为字符串格式。

string str = null.toString();


文章来源: How string.Format handles null values?