为什么 string.Format 不抛出 ArgumentNullException?
Why string.Format does not throw ArgumentNullException?
根据 MSDN String.Format 如果格式为 null(相当合理)则抛出,link here.
但测试表明它仅在第二个参数也为 null 时才执行此操作,而不是在填充第二个参数时执行此操作。
以下不抛出:
string test = string.Format(null, "string");
以下抛出抱怨第一个参数(格式):
string test = string.Format(null, null);
使用 JustDecompile 进一步挖掘源代码调用以下方法:
private static string FormatHelper(IFormatProvider provider, string format, ParamsArray args)
{
if (format == null)
{
throw new ArgumentNullException("format");
}
return StringBuilderCache.GetStringAndRelease(StringBuilderCache.Acquire(format.Length + args.Length * 8).AppendFormatHelper(provider, format, args));
}
这没有意义,因为 format 为 null 并且没有抛出异常。有什么提示吗?
啊,重载决议的乐趣。在这种情况下,您实际上是在调用 string.Format(IFormatProvider, string, params object[])
- 因此您为 provider
参数传递了一个空参数,这是完全有效的(并且意味着使用当前的文化)。
重载是 "better" 因为第二个参数从字符串文字到 string
的转换比从字符串文字到 object
.
的转换要好
如果您使用参数名称强制正确重载,请加载:
string text = string.Format(format: null, arg0: "string");
...然后它会按预期抛出异常。
根据 MSDN String.Format 如果格式为 null(相当合理)则抛出,link here.
但测试表明它仅在第二个参数也为 null 时才执行此操作,而不是在填充第二个参数时执行此操作。
以下不抛出:
string test = string.Format(null, "string");
以下抛出抱怨第一个参数(格式):
string test = string.Format(null, null);
使用 JustDecompile 进一步挖掘源代码调用以下方法:
private static string FormatHelper(IFormatProvider provider, string format, ParamsArray args)
{
if (format == null)
{
throw new ArgumentNullException("format");
}
return StringBuilderCache.GetStringAndRelease(StringBuilderCache.Acquire(format.Length + args.Length * 8).AppendFormatHelper(provider, format, args));
}
这没有意义,因为 format 为 null 并且没有抛出异常。有什么提示吗?
啊,重载决议的乐趣。在这种情况下,您实际上是在调用 string.Format(IFormatProvider, string, params object[])
- 因此您为 provider
参数传递了一个空参数,这是完全有效的(并且意味着使用当前的文化)。
重载是 "better" 因为第二个参数从字符串文字到 string
的转换比从字符串文字到 object
.
如果您使用参数名称强制正确重载,请加载:
string text = string.Format(format: null, arg0: "string");
...然后它会按预期抛出异常。