C# System.Convert.ToInt vs(int)

C# System.Convert.ToInt vs(int),c#,types,C#,Types,我在另一篇帖子中注意到,有人做了如下事情: double d = 3.1415; int i = Convert.ToInt32(Math.Floor(d)); 为什么他们使用convert函数,而不是: double d = 3.1415; int i = (int)d; 它有一个隐式的floor和convert 另外,更令人担忧的是,我在阅读的一些生产代码中注意到: double d = 3.1415; float f = Convert.ToSingle(d); 这与: float

我在另一篇帖子中注意到,有人做了如下事情:

double d = 3.1415;
int i = Convert.ToInt32(Math.Floor(d));
为什么他们使用convert函数,而不是:

double d = 3.1415;
int i = (int)d;
它有一个隐式的floor和convert

另外,更令人担忧的是,我在阅读的一些生产代码中注意到:

double d = 3.1415;
float f = Convert.ToSingle(d);
这与:

float f = (float)d;

所有这些隐式转换都只是为了完整性而在Convert类中进行的,还是有其作用?我可以理解对.ToString()的需要,但不能理解其余部分。

当您有一个字符串要转换为int时,可以使用Convert

int i = Convert.ToInt32("1234");
如果转换和强制转换失败,它们都将抛出异常

i、 e,这仍然会引发异常,它不会返回0:

Convert.ToInt32("1234NonNumber");

在许多情况下,转换和强制转换的结果相同,但强制转换通常更容易阅读。

强制转换为int是隐式截断,而不是隐式转换:

double d = -3.14;
int i = (int)d;
// i == -3

我选择Math.Floor或Math.Round以使我的意图更加明确。

Convert.ToInt32()用于字符串(),而强制转换只能用于具有内部转换器(数字类型)的类型。真正的诀窍在于决定Int32.Parse和Convert.ToInt32()之间的关系。Convert.ToInt32()允许使用null参数并返回0,而Int32.Parse()将引发ArgumentNullException。

舍入的处理方式也不同:

x=-2.5(int)x=-2转换为32(x)=-2
x=-1.5(int)x=-1转换为32(x)=-2
x=-0.5(int)x=0转换为32(x)=0
x=0.5(int)x=0转换为32(x)=0
x=1.5(int)x=1转换为32(x)=2
x=2.5(int)x=2转换为32(x)=2

注意x=-1.5和x=1.5的情况。
在某些算法中,使用的舍入方法对于获得正确答案至关重要。

不会将“Int32.Parse(String):Int32”实际将字符串转换为int?Int32.Parse会将“数值”字符串转换为int,如果转换失败,它会抛出异常。如果转换失败,Int32.TryParse将返回false;如果转换失败,Convert.ToInt32将返回0。