一个问题,在今天的工作出现了有关如何将对象转换成它的具体类型(int
),我说要投它:为什么在转换中使用Convert.ToInt32?
int i = (int)object;
一个同事说用Convert.ToInt32()
。
int i = Convert.ToInt32(object)
Convert.ToInt32()
和直接对象投射之间有什么区别?
一个问题,在今天的工作出现了有关如何将对象转换成它的具体类型(int
),我说要投它:为什么在转换中使用Convert.ToInt32?
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
}
当原始类型有新类型定义的投你只能投。因此,从一种数字类型转换为另一种数字类型(例如,从长到整数)通常是可能的,但通常不可能从非数字类型转换为数字类型(例如,字符串转换为整数)。转换提供了更多的方法来将这些非数字类型更改为数字,因此使用它的原因是您不太可能得到错误。
如果您知道盒装实例是一个int型,您可以放心地使用(int)
演员操作符将其解开。但是,如果它的可转换为int(例如float),则使用cast操作符将在运行时失败。
查看Convert
类文档以获取有关其允许和不允许的特定转换的更多详细信息。
我倾向于更喜欢Convert
我自己只是因为它提供了一个很好的统一的转换接口。例如Convert.ToInt32("45")
工作但(int)"45"
,不。
Convert
也会报告抛掷OverflowException
等问题。由于长时间投射到int可能会导致效果不佳,并且运行时不会告诉您,因此投射可能很危险。
我也喜欢Convert.ToX(object obj)
存在,它可以让你把东西烧掉到Convert
,大部分都忘了它。
在你的第二个陈述上;你在默认情况下说的是真实的,但是你可以把这个转换包装在一个“checked”块中,在这种情况下会抛出一个ArithmeticOverflowException。 – KeithS 2011-02-09 16:35:00
他们是根本不同的
铸造说,该对象被强制转换为类的一个实例,因此投放。
Convert表示在转换的类型之间存在转换。
因此,例如,您不能将一个字符串强制转换为int,但可以将其转换。由于特定类型的内置转换规则中存在某些灰色区域/重叠,或者您可以添加到自己的类型中的显式转换转换。但通常我不会认为这两个是等同的。
鉴于没有“更好的”选项,您应该使用在给定的上下文中有意义的选项。
我认为这是一个意图问题。演员明确地说:“我知道你是一个'int'!”而转换说:“我不知道你是什么,但最终我知道你会成为一个`int`” – Greg 2011-02-09 16:49:03
所不同的是Convert.ToInt32(object value)
会尝试使用IConvertible
将该值转换为int,其中,如果此类强制转换无效,则直接强制转换将简单地引发异常。
其他过载也尝试转换而不是铸造。
Convert.ToInt32是基本相同int.Parse 有一点不同:如果你使用int.Parse(空)抛出一个异常,而Convert.ToInt32返回0
铸造,另一方面是一个更复杂的操作,并且只有当值真的是可以隐式转换的盒装int或anohter(盒装/非盒装)值类型时才起作用。
(拳击是值类型的对象表示)
转换是包含一系列静态方法和被suposed到用于转换基本类型的一类,所述支持的类型为布尔型,字符型,为SByte ,Byte,Int16,Int32,Int64,UInt16,UInt32,UInt64,Single,Double,Decimal,DateTime和String。 转换操作符允许您执行相同的操作,但您也可以将其用于其他类型,包括您创建的类型。你也可以在你的类中定义这个运算符,允许你从任何东西转换成任何东西。 因此,即差异,一个是方法,另一个是运算符,我没有检查转换和int到字符串时的operaror的胆量,但它可能具有与Convert中的方法相同的逻辑。
您要查找的单词在第二个“段落”中“明确” - 隐含的是“int i = s”。 – 2017-01-08 23:57:44