我很想知道将一个变量转换为int
和使用Convert.ToInt32()
的区别是什么。是否有一种方法比另一种更加高效?
此外,应该在哪种情况下使用每一个?目前,我更倾向于使用Convert
,但我没有理由选择其中的任何一种。在我看来,它们都可以实现相同的目标。
当变量类型为int
时,使用Cast转换;当变量类型不是int
但你希望它变成int
类型时,使用Convert转换。
例如,当你知道变量o是一个整数时,可以这样写:int i = (int)o;
当"123"不是一个整数而是一个字符串表示的整数时,可以使用Convert.ToInt32("123")
进行转换。
在另一个论坛上查看Cast和Convert之间的差异
Convert.ToInt32(String, IFormatProvider)
底层调用Int32.Parse
(请参阅备注)。
因此,唯一的区别在于如果传递了空字符串,则返回0
,而Int32.Parse
会抛出ArgumentNullException
。
实际上,无论使用哪种方法都是个人选择。
个人而言,我都不使用它们,而倾向于使用TryParse
函数(例如System.Int32.TryParse()
)。
顶部链接已失效,请查看StackOverflow上这个答案。
object o = 1L; double d = (double)o;
将会失败,而 Convert.ToDouble(o)
则能正常工作。 - Domino还有一个区别。"转换"总是进行溢出检查,而"强制转换"则可能取决于您的设置以及使用的 "checked" 或 "unchecked" 关键字。
更明确地说,请考虑以下代码:
int source = 260;
byte destination = (byte)source;
目的地将会在没有警告的情况下变为4。
但是:
int source = 260;
byte destination = Convert.ToByte(source);
会给你一个异常。
并非所有类型都支持转换,比如:
int i = 0;
decimal d = (decimal)i;
强制类型转换只是告诉编译器该对象实际上是不同类型的实现,并且现在应将其视为新实现。而转换则表示它不继承要转换的内容,但有一种固定的方式可以进行转换。例如,假设我们将“16”转换为int。“16”是一个字符串,与int没有任何继承关系。但是,显然可以将“16”转换为int 16。
在这里我想提出一点建议,似乎有必要做一个概念上的区分。虽然我不是专家:
强制类型转换是改变代表类型。所以"32"、32L和32.0f之间进行强制类型转换似乎是合理的。C#不会自动支持"32",但大多数动态语言都会。因此我会使用(long)"32"或(String)32L。只要能用就用。我还有另一个规则——强制类型转换应该是可逆的。
转换不需要可逆,可以简单地创建一个全新的对象。
灰色地带是例如字符串"32xx"。可以认为当你将其转换时,它变成了32L(数字被解析直到无法解析为止)。Perl就是这样使用的。但这违反了我的可逆性要求。对于32.5f到32L也是同样的情况。几乎所有的语言,包括非常静态类型的语言都允许这种转换,但它也不符合可逆性规则。这是一个灰色地带,如果你允许"32"被转换,那么在编译时你就不知道它是否可能是"32xxx"。
还有一种区别可以做的是只用强制类型转换来进行"IsA"而不是"makeLookLikeA"。所以如果你知道一个字符串来自数据库但实际上在非正式模式中是一个整数,可以放心地使用强制类型转换(虽然在这种情况下C#希望你使用Convert)。同样的情况也适用于浮点数。但不能用于只是用强制类型转换来截断浮点数的情况。这种区别还考虑了向下转型和向上转型——对象始终是'IsA',但类型可能已经被概括为列表。
Convert.ToInt32
有很多重载,可以接受例如字符串之类的参数。尝试将字符串强制转换为整数会导致编译错误。关键在于它们用于不同的情况。当你不确定要从哪种类型的对象进行转换时,Convert特别有用。
你应该使用Convert.ToInt32而不是强制转换的另一个原因是:
例如:
float a = 1.3f;
float b = 0.02f;
int c = (int)(a / b);
int d = Convert.ToInt32(a / b);`
结果是 c = 64,d = 65
string number = "123abc";
int num;
Int32.TryParse(number, out num); // 在此调用中没有抛出异常
Convert.ToInt32(number); // 在此调用中抛出了异常
Convert.To()
的区别。因此,我的问题作为你的问题的补充。 - user5398447