Convert.ToString(str)和str?.ToString()之间的区别”

时间:2018-11-26 08:47:53

标签: c# performance optimization

这两种方法之间有什么区别吗?

static void Main(string[] args)
{
    object str = null;

    string test1 = str?.ToString() ?? "";

    string test2 = Convert.ToString(str);
}

编辑1:

正如@Fabio所指出的,我们有第三种可能的方法:

string test3 = $"{str}";

3 个答案:

答案 0 :(得分:3)

因此,直接回答您的问题:任何方法之间都没有没有差异。如果IFormatProvider过载,会有区别。

现在进入细节:

Convert.ToString将尝试以该顺序调用IConvertibleIFormattable接口,然后退回到基数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