2011-02-09 118 views
17

一个问题,在今天的工作出现了有关如何将对象转换成它的具体类型(int),我说要投它:为什么在转换中使用Convert.ToInt32?

int i = (int)object; 

一个同事说用Convert.ToInt32()

int i = Convert.ToInt32(object) 

Convert.ToInt32()和直接对象投射之间有什么区别?

回答

16

不是每个物体都可以直接投射到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 
} 
+0

您要查找的单词在第二个“段落”中“明确” - 隐含的是“int i = s”。 – 2017-01-08 23:57:44

1

当原始类型有新类型定义的投你只能投。因此,从一种数字类型转换为另一种数字类型(例如,从长到整数)通常是可能的,但通常不可能从非数字类型转换为数字类型(例如,字符串转换为整数)。转换提供了更多的方法来将这些非数字类型更改为数字,因此使用它的原因是您不太可能得到错误。

0

如果您知道盒装实例是一个int型,您可以放心地使用(int)演员操作符将其解开。但是,如果它的可转换为int(例如float),则使用cast操作符将在运行时失败。

查看Convert类文档以获取有关其允许和不允许的特定转换的更多详细信息。

1

我倾向于更喜欢Convert我自己只是因为它提供了一个很好的统一的转换接口。例如Convert.ToInt32("45")工作但(int)"45",不。

Convert也会报告抛掷OverflowException等问题。由于长时间投射到int可能会导致效果不佳,并且运行时不会告诉您,因此投射可能很危险。

我也喜欢Convert.ToX(object obj)存在,它可以让你把东西烧掉到Convert,大部分都忘了它。

+2

在你的第二个陈述上;你在默认情况下说的是真实的,但是你可以把这个转换包装在一个“checked”块中,在这种情况下会抛出一个ArithmeticOverflowException。 – KeithS 2011-02-09 16:35:00

9

他们是根本不同的

铸造说,该对象被强制转换为类的一个实例,因此投放。

Convert表示在转换的类型之间存在转换。

因此,例如,您不能将一个字符串强制转换为int,但可以将其转换。由于特定类型的内置转换规则中存在某些灰色区域/重叠,或者您可以添加到自己的类型中的显式转换转换。但通常我不会认为这两个是等同的。

鉴于没有“更好的”选项,您应该使用在给定的上下文中有意义的选项。

+8

我认为这是一个意图问题。演员明确地说:“我知道你是一个'int'!”而转换说:“我不知道你是什么,但最终我知道你会成为一个`int`” – Greg 2011-02-09 16:49:03

0

所不同的是Convert.ToInt32(object value)会尝试使用IConvertible将该值转换为int,其中,如果此类强制转换无效,则直接强制转换将简单地引发异常。

其他过载也尝试转换而不是铸造

1

Convert.ToInt32是基本相同int.Parse 有一点不同:如果你使用int.Parse(空)抛出一个异常,而Convert.ToInt32返回0

铸造,另一方面是一个更复杂的操作,并且只有当值真的是可以隐式转换的盒装int或anohter(盒装/非盒装)值类型时才起作用。

(拳击是值类型的对象表示)

1

转换是包含一系列静态方法和被suposed到用于转换基本类型的一类,所述支持的类型为布尔型,字符型,为SByte ,Byte,Int16,Int32,Int64,UInt16,UInt32,UInt64,Single,Double,Decimal,DateTime和String。 转换操作符允许您执行相同的操作,但您也可以将其用于其他类型,包括您创建的类型。你也可以在你的类中定义这个运算符,允许你从任何东西转换成任何东西。 因此,即差异,一个是方法,另一个是运算符,我没有检查转换和int到字符串时的operaror的胆量,但它可能具有与Convert中的方法相同的逻辑。

相关问题