今天在工作中遇到了一个问题,需要将一个对象转换为其特定类型(例如int
),我说可以使用强制转换:
int i = (int)object;
我的同事建议我使用Convert.ToInt32()
。
int i = Convert.ToInt32(object)
Convert.ToInt32()
和直接对象转换之间有什么区别?
并非所有对象都可以直接转换为 int
。例如,以下代码将无法编译:
string s = "1";
int i = (int)s;
因为 string
不能隐式转换为 int
。string s = "1";
int i = Convert.ToInt32(s);
顺带一提,类型转换和Convert
都可能在无法转换输入对象时抛出异常。但是,如果int.TryParse
失败,它不会抛出异常;而是返回false(但是它只接受一个字符串,因此您必须在使用之前将输入对象转换为字符串:.ToString()
):
object s = "1";
int i;
if(int.TryParse(s.ToString(), out i))
{
// i now has a value of 1
}
它们在本质上是不同的。
Casting 表示对象是要转换为的类型的实例,因此需要进行强制转换。
Convert 表示要转换的类型之间存在转换关系。
例如,您无法将字符串强制转换为整数,但可以进行转换。由于特定内置类型的强制转换规则或者可以添加到自己类型的显式强制转换,某些灰色地带存在重叠。但通常情况下我认为这两者不相等。
鉴于没有“更好”的选择,应该根据给定的上下文使用合适的选项。
只有当原始类型为新类型定义了强制转换时,才能进行强制转换。因此,通常可以将一种数值类型转换为另一种数值类型(例如,将 long 转换为 int),但通常无法将非数值类型转换为数值类型(例如,将 string 转换为 int)。Convert 提供了更多的方法来将这些非数值类型转换为数值类型,因此使用它的原因是您不太可能遇到错误。
我个人更倾向于使用Convert
,因为它提供了一个良好的转换统一接口。例如:Convert.ToInt32("45")
可以正常工作,但(int)"45"
会报错。
Convert
还会报告异常,如抛出OverflowException
。强制类型转换很危险,例如从长整型转换成整型可能会导致错误的结果,并且运行时不会告诉你。
我也喜欢Convert.ToX(object obj)
的存在,这样您只需将对象传递给Convert
,大多数情况下就可以忘记它。
Convert.ToInt32基本上与int.Parse相同,只有一个区别:如果使用int.Parse(null),则会抛出异常,而Convert.ToInt32返回0
另一方面,强制转换是一种更复杂的操作,只有在值确实是已装箱的int或另一个(已装箱/未装箱)可以隐式转换的值类型时才能起作用。
(装箱是值类型的对象表示)
区别在于Convert.ToInt32(object value)
尝试使用IConvertible
将值转换为int,而直接强制转换将仅在此类转换无效时引发异常。
其他重载也尝试转换而不是强制转换。
int i = s
。 - anon