我很好奇,想知道有什么区别铸说的之间int
相对于使用Convert.ToInt32()
。使用它可以获得某种性能提升吗?
另外,每种情况都应用于哪些情况?目前,我更倾向于使用,Convert
但我没有理由选择任何一种方式。在我看来,他们两个都实现了相同的目标。
Answers:
参见在其他论坛上的转换与转换之间的区别
在
Convert.ToInt32(String, IFormatProvider)
下面调用Int32.Parse
(读的话)。
因此,唯一的区别是,如果传递了null字符串0
,则返回,而Int32.Parse
抛出ArgumentNullException
。
无论使用哪种方式,这实际上都是一个选择问题。
就我个人而言,我既不使用,也不倾向于使用TryParse
功能(例如System.Int32.TryParse()
)。
顶部的链接已断开,请在StackOverflow上查看此答案。
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
并非所有类型都支持转换,例如
int i = 0;
decimal d = (decimal)i;
因为它需要实现显式运算符。但是.NET也提供IConvertible接口,因此任何实现该接口的类型都可以转换为大多数框架内置类型。最后,Convert类有助于与实现IConvertible接口的类型一起操作。
扔到我的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”,但是类型可能已针对列表进行了概括。
有很多重载Convert.ToInt32
,例如字符串。尝试将字符串强制转换为int时将引发编译错误。关键是它们有不同的用途。当您不确定要投射的对象是哪种类型时,转换特别有用。
还有一个原因应该使用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
字符串号=“ 123abc”;
整数
Int32.TryParse(number,out num); //此调用没有抛出异常
Convert.ToInt32(数字); //在此调用中抛出异常
Convert.To()
。因此,我的问题可以作为您问题的补充。