何时使用Cast或Convert


77

我很好奇,想知道有什么区别铸说的之间int相对于使用Convert.ToInt32()。使用它可以获得某种性能提升吗?

另外,每种情况都应用于哪些情况?目前,我更倾向于使用,Convert但我没有理由选择任何一种方式。在我看来,他们两个都实现了相同的目标。


4
不同意我的问题是一个确切的这个问题的重复。该问题询问何时使用强制转换或转换,并且下面的接受的答案指出:“无论使用哪种方式,这实际上都是选择的问题。” 我的问题专门要求强制转换和使用之间的区别Convert.To()。因此,我的问题可以作为您问题的补充。

Answers:


39

参见在其他论坛上的转换与转换之间的区别

回答

Convert.ToInt32(String, IFormatProvider)下面调用Int32.Parse(读的话)。
因此,唯一的区别是,如果传递了null字符串0,则返回,而Int32.Parse抛出ArgumentNullException
无论使用哪种方式,这实际上都是一个选择问题。

就我个人而言,我既不使用,也不倾向于使用TryParse功能(例如System.Int32.TryParse())。


更新

顶部的链接已断开,请在StackOverflow上查看此答案


72
重要提示:我最近注意到的另一个区别是,“转换”将1.63转换为1,而“转换”将1.63转换为2。因此,转换和舍入基本上都是转换,但是将小数点后的值舍去。
阿比耶特·帕特罗

有时TryParse不可用。
Shaun Luttin 2014年

3
紧凑架构缺少的TryParse:stackoverflow.com/questions/22670260/...
肖恩Luttin

2
约瑟·阿尔巴哈里(Joseph Albahari)和本·阿尔巴哈里(Ben Albahari)从C#5.0中引用了@AbijeetPatro的注释,仅供参考。版权所有©2012 Joseph Albahari和Ben Albahari,978-1-449-32010-2。 When you cast from a floating-point number to an integral, any fractional portion is truncated; no rounding is performed. The static class System.Convert provides methods that round while converting between various numeric types
BurakKarakuş2015年

1
OP在哪里说他要转换字符串?如果强制转换为选项,则不能为字符串。
蒂姆·施密特

78

当它确实是一种类型时进行int转换,当它不是一种int但您希望使其成为一种时进行转换。

例如,int i = (int)o;当您知道o是一个整数时

int i = Convert.ToInt32("123") 因为“ 123”不是整数,所以是整数的字符串表示形式。


1
使用枚举对您有何影响?
乔纳斯·斯托斯基

12

还有另一个区别。“转换”始终会进行溢出检查,而“转换”可能会一直进行溢出检查,具体取决于您的设置以及所使用的“选中”或“未选中”关键字。

更明确地说。考虑以下代码:

int source = 260;
byte destination = (byte)source;

然后目的地将为4,而不会发出警告。

但:

int source = 260;
byte destination = Convert.ToByte(source);

会给你一个例外。


6

并非所有类型都支持转换,例如

int i = 0;
decimal d = (decimal)i;

因为它需要实现显式运算符。但是.NET也提供IConvertible接口,因此任何实现该接口的类型都可以转换为大多数框架内置类型。最后,Convert类有助于与实现IConvertible接口的类型一起操作。


4

强制转换只是告诉编译器该对象实际上是其他类型的实现,现在将其视为新的实现。转换者说这并不继承您要转换的内容,但是有一种固定的方式可以做到这一点。例如,假设我们将“ 16”转换为整数。“ 16”是一个字符串,不以任何方式继承自int。但是,很明显可以将“ 16”转换为int 16。


2

扔到我的2c中-似乎概念上的区别可能有用。不是我是专家..:

铸造正在改变代表类型。因此,“ 32”与32L和32.0f在彼此之间进行转换似乎是合理的。c#不会自动支持“ 32”,但是大多数动态语言都支持。因此,我将使用(长)“ 32”或(字符串)32L。当我可以的时候。我还有一条规则-投射应该是可翻倒的。

转换不必是可绕行的,而可以简单地创建一个全新的对象。

灰色区域例如是字符串“ 32xx”。可以证明,当您强制转换时,它变为32L(直到无法解析为止,该数字都会被解析)。Perl使用了这个。但这违反了我的往返行程要求。32.5f至32L也是如此。几乎所有语言(包括非常静态类型的语言)都允许这样做,并且它也无法通过可翻倒规则。它是灰色的,如果您允许强制转换为“ 32”,则在编译时不知道它是否可能为“ 32xxx”。

可以做出的另一个区别是仅对“ IsA”使用强制转换,而对“ makeLookLikeA”不使用强制转换。因此,如果您知道字符串来自数据库,但实际上是非官方模式中的int,请随时使用强制转换(尽管在这种情况下c#仍然希望您使用Convert)。浮动也一样。但不适用于仅使用强制转换截断浮点数的情况。这种区别也说明了DownCasting和UpCasting -对象始终为“ IsA”,但是类型可能已针对列表进行了概括。


1

有很多重载Convert.ToInt32,例如字符串。尝试将字符串强制转换为int时将引发编译错误。关键是它们有不同的用途。当您不确定要投射的对象是哪种类型时,转换特别有用。


0

还有一个原因应该使用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


这不是因为强制转换,这是转换规则。当您将2个浮点数相除时,将收到双精度值64.999999068677411,将其强制转换为int时,它将截断为整数部分。但这将返回65:(int)(float)(a / b)),因为在float中,它正好是65,而不是64.99(9)。十进制相同。相比之下,转换将结果四舍五入,因此此处返回65,但64.49将为64。有趣的是Intellisense说强制转换为浮点数是多余的,而没有它则返回64
Vitaly

0

字符串号=“ 123abc”;

整数

Int32.TryParse(number,out num); //此调用没有抛出异常

Convert.ToInt32(数字); //在此调用中抛出异常

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.