这两种方法之间有什么区别吗?
static void Main(string[] args)
{
object str = null;
string test1 = str?.ToString() ?? "";
string test2 = Convert.ToString(str);
}
编辑1:
正如@Fabio所指出的,我们有第三种可能的方法:
string test3 = $"{str}";
答案 0 :(得分:3)
因此,直接回答您的问题:任何方法之间都没有没有差异。如果IFormatProvider
过载,会有区别。
现在进入细节:
Convert.ToString
将尝试以该顺序调用IConvertible
和IFormattable
接口,然后退回到基数object.ToString
。因此,如果您传递的东西没有实现这些接口中的任何一个(或不能在其中调用任何成员方法的null
),那么它与简单的object.ToString
之间就不会有任何区别。>
现在字符串插值是复合格式的一种情况(字符串插值实际上等效于调用string.Format
)。在回退到IFormattable
之前,这将只调用object.ToString
接口实现。同样,如果某些东西未实现接口(或null
),则没有区别。
为了使事情变得更复杂,这两个方法都包含带有IFormatProvider
参数的重载。对于Convert.ToString
,如果对象实现了IConvertible.ToString(IFormatProvider)
接口,则该方法将尝试调用IConvertible
。然后,它将尝试IFormattable.ToString(String, IFormatProvider)
,如果失败,则会退回到object.ToString()
。
如果使用复合格式,它将尝试调用IFormatProvider.GetFormat
方法,然后使用返回的ICustomFormatter
。如果失败,它将继续IFormattable
,最后退回到object.ToString
。
当涉及null
值时,使用IFormatProvider
可能有所不同。由于Convert.ToString
尝试调用IConvertible
实现,并且您实际上不能在null
上调用任何内容,因此它将null
视为特例并返回{{1} }。但是,复合格式会使用对象作为参数来调用string.Empty
,因此,如果您使用对ICustomFormatter.Format
进行不同处理的ICustomFormatter
,则会得到不同的结果!您可以使用this code snippet进行验证(免责声明:不是实现null
的最明智的方法,但是它只是一个示例)。
这里是the MSDN doc for Convert.ToString
。
这里是the MSDN doc for composite formatting(请参阅处理订单部分)。
答案 1 :(得分:0)
如果我们使用Convert.ToString,那么它可以处理空值。但是Tostring不能处理空值
例如:
object str=null;
System.out.print(convert.ToString(str)); //shows null value
String s=str.ToString();
System.out.print(s); //throws exception
答案 2 :(得分:0)
Convert.ToString在调用基本Object.ToString之前尝试使用IFormattable和IConvertible接口 例子
class FormattableType : IFormattable
{
private double value = 0.42;
public string ToString(string format, IFormatProvider formatProvider)
{
if (formatProvider == null)
{
// ... using some IOC-containers
// ... or using CultureInfo.CurrentCulture / Thread.CurrentThread.CurrentCulture
formatProvider = CultureInfo.InvariantCulture;
}
// ... doing things with format
return value.ToString(formatProvider);
}
public override string ToString()
{
return value.ToString();
}
}
结果:
Convert.ToString(new FormattableType()); // 0.42
new FormattableType().ToString(); // 0,42