C# x、 ToString()或x+&引用&引用;?

C# x、 ToString()或x+&引用&引用;?,c#,C#,这个问题可能看起来很愚蠢和/或离题,但对我来说很有趣 在C#中,假设您有一个名为x的变量,它的类型并不重要(x的类型可能是int,char,long或其他……)。对于这个x操作比另一个更快x.ToString()或x+“” 我不知道哪个更快,但我认为在天文迭代中,x+”应该更快。但是根据逻辑x.ToString()方法应该更快 我知道C#是高级编程语言。这就是为什么C#离开了机器语言。因此,执行时间会变慢 如果有人对此进行了测试,请告诉我哪种方法以及为什么比另一种方法更快。如果您编译x+“”代码

这个问题可能看起来很愚蠢和/或离题,但对我来说很有趣

在C#中,假设您有一个名为
x
的变量,它的类型并不重要(
x
的类型可能是
int
char
long
或其他……)。对于这个
x
操作比另一个更快<代码>x.ToString()
x+“”


我不知道哪个更快,但我认为在天文迭代中,
x+”
应该更快。但是根据逻辑
x.ToString()
方法应该更快

我知道C#是高级编程语言。这就是为什么C#离开了机器语言。因此,执行时间会变慢


如果有人对此进行了测试,请告诉我哪种方法以及为什么比另一种方法更快。

如果您编译
x+“”
代码,然后将其反编译或查看IL,您会注意到编译器将其替换为
string.Concat
调用:

x1 = input + "";
变成

x1 = string.Concat(input);
如果您看到它确实调用了
ToString
,但它也对输入进行了额外的
null
检查:

public static String Concat(Object arg0) {
    Contract.Ensures(Contract.Result<String>() != null);
    Contract.EndContractBlock();

    if (arg0 == null)
    {
        return String.Empty;
    }
    return arg0.ToString();
}
公共静态字符串Concat(对象arg0){
Contract.sure(Contract.Result()!=null);
Contract.EndContractBlock();
如果(arg0==null)
{
返回字符串。空;
}
返回arg0.ToString();
}
因此,正如您所看到的,execute比
ToString
调用更需要代码,这意味着它不能比
ToString
调用更快

如果JIT在某些情况下能够优化空检查,那么它们可能非常接近,但一般来说,
+“
将比
ToString
调用慢


但您也应该注意到,这两种方法的行为并不完全相同:
null
上的
ToString
将抛出
NullReferenceException
,而
+
将返回空字符串。

如果编译
x+
代码,然后将其反编译或查看IL,您会注意到编译器将其替换为
string.Concat
call:

x1 = input + "";
变成

x1 = string.Concat(input);
如果您看到它确实调用了
ToString
,但它也对输入进行了额外的
null
检查:

public static String Concat(Object arg0) {
    Contract.Ensures(Contract.Result<String>() != null);
    Contract.EndContractBlock();

    if (arg0 == null)
    {
        return String.Empty;
    }
    return arg0.ToString();
}
公共静态字符串Concat(对象arg0){
Contract.sure(Contract.Result()!=null);
Contract.EndContractBlock();
如果(arg0==null)
{
返回字符串。空;
}
返回arg0.ToString();
}
因此,正如您所看到的,execute比
ToString
调用更需要代码,这意味着它不能比
ToString
调用更快

如果JIT在某些情况下能够优化空检查,那么它们可能非常接近,但一般来说,
+“
将比
ToString
调用慢


但是您也应该注意到,这两个函数的行为并不完全相同:
null
上的
ToString
将抛出
NullReferenceException
,而
+“
将返回一个空字符串。

我没有测试它,但我想。ToString()应该更快,如果有任何区别的话,因为此操作需要字符串转换。我没有亲自测试过它,但我相信你可以很容易地自己做(你甚至解释过)
x+”
是空安全的,而
x.ToString()
不是。“我认为在天文迭代中x+”“应该更快”-为什么?@UweKeim可以防止抛出
NullReferenceException
,但是结果会有所不同:
+”
null
返回空字符串,而
?.ToString()
将返回
null
。我还没有测试过它,但我想.ToString()应该更快,如果有任何区别的话,因为这个操作需要字符串转换。我没有亲自测试过它,但我相信你可以很容易地自己做(你甚至解释过)
x+”
是空安全的,而
x.ToString()
不是。“我认为在天文迭代中x+”“应该更快”-为什么?@UweKeim可以防止抛出
NullReferenceException
,但是结果会有所不同:
+”
null
返回空字符串,而
?.ToString()
将返回
null
。这就是我需要的!非常感谢!!这就是我需要的!非常感谢!!