string.Format如何处理空值?

问题描述 投票:61回答:5

在下面的代码中,为什么两个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);
}

有人可以帮我理解两者之间的区别吗?

c# .net string.format
5个回答
48
投票

我在这里猜测,但这似乎是您遇到的重载呼叫的区别。 String.Format具有多个重载,这与您要击中的重载有关。

在第一个示例中,您要按String.Format才有意义。

在第二个示例中,通过提供String.Format(string,object),您很可能会击中String.Format(string,object),根据文档,在以下情况下,这会引发null

format或args为空。

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

String.Format(string,params object[])

为什么会达到String.Format(string,params object[])超载?可能是因为ArgumentNullException不是对象,并且String.Format("Another exception occured: {0}", arg0: null); 的工作方式是您可以在调用中将每个值作为新对象传递给[[任一,并将值的数组传递给它。也就是说,以下是params object[]

null
因此,它将您的声明调用翻译为以下内容:

params


11
投票
在您的第一个示例中,您点击了one in the same,在拆卸时看起来像这样:

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();

[第二个,您显然正在使用Format(String, Object)用法,至少那是我执行相同测试时所调用的用法。拆卸后,看起来像这样:

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

因此,所有这些实际上都集中到了new object[]。很酷,让我们看看那里的前几行:

Format(string, object[])

...很高兴,您的问题就在那里!第一次调用将其包装在新数组中,因此它不是null。由于要调用的 public static string Format(string format, params object[] args)
 {
     return Format(null, format, args);
 }
的特定实例,因此显式传递null并不能做到这一点。

2
投票
第一个调用被解析为对Format(object)的调用,而第二个调用被解析为对Format(object [])的调用。这些不同的重载对Null参数的处理方式有所不同。

2
投票
如果您使用插值字符串($“”,另一种格式化方式),则将忽略null并跳过该null。所以

-3
投票
有以下两个区别: