可以对内置类型的 object.ToString() 和 IFormattable.ToString(string, IFormatProvider) 之间的关系做出任何假设吗?

Can any assumptions be made about the relationship between object.ToString() and IFormattable.ToString(string, IFormatProvider) for built-in types?

我正在为聚合记录编写一些字符串输出格式化代码(考虑 CSV 格式输出)。除了简单的 object.ToString().

之外,我正在尝试编写它,以便通过 IFormattable.ToString(string, IFormatProvider) 接口利用许多类型的内置字符串格式化功能

为了减少代码重复,如果能够对 object.ToString()IFormattable.ToString(string, IFormatProvider) 之间的关系做出一些假设就好了。

例如,是否可以据此假设ToString() == ToString(null, null)?是否有维护该映射的默认区域性或格式提供程序?还是两者没有必然关系?

根据 MSDN 文档和 .NET 源代码,您可以假设对于内置类型 ToString() 等同于 ToString(null, null)ToString("G", null).

在 MSDN 的 Formatting Types in the .NET Framework 中有一些关于它的信息。

例如根据那个网站Int32.ToString()

Calls Int32.ToString("G", NumberFormatInfo.CurrentInfo) to format the Int32 value for the current culture.

如果您检查 source code,您会注意到 ToString() 调用了

Number.FormatInt32(m_value, null, NumberFormatInfo.CurrentInfo);

String ToString(String format, IFormatProvider provider) 调用

Number.FormatInt32(m_value, format, NumberFormatInfo.GetInstance(provider));

所以 format 实际上是 null,而不是 "G"。不过这没什么区别,因为 "G"null 应该是一样的。 NumberFormatInfo.GetInstance(null) returns NumberFormatInfo.CurrentInfo, 所以 Int32.ToString() 等同于 Int32.ToString("G", null)Int32.ToString(null, null).

您可以使用 IFormattable.ToString 文档仔细检查它以查看 nulls 确实指示了两个参数的默认值。

Parameters

format

The format to use.

-or-

A null reference (Nothing in Visual Basic) to use the default format defined for the type of the IFormattable implementation.

formatProvider

The provider to use to format the value.

-or-

A null reference (Nothing in Visual Basic) to obtain the numeric format information from the current locale setting of the operating system.