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