何时使用Cast或Convert

我很好奇,知道什么之间的差异之间的演员说一个int相比,使用Convert.toInt32()。 使用一个有什么样的性能增益?

还应该分别使用哪种情况。 目前我更倾向于使用转换,但我没有理由去任何方式。 在我看来,我看到他们都实现了同样的目标。

在另一个论坛上查看演员和转换之间的差异

回答

下面的Convert.ToInt32(String, IFormatProvider)调用Int32.Parse (读取注释)。
所以唯一的区别是,如果传递一个空string,它返回0 ,而Int32.Parse抛出一个ArgumentNullException
无论你使用什么,这都是一个真正的问题。

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


UPDATE

顶部链接已损坏,请在StackOverflow上查看此答案 。

当它是一个inttypes时进行投射,当它不是一个int时进行转换,但是你希望它变成一个int

例如int i = (int)o; 当你知道o是一个int

int i = Convert.ToInt32("123")因为“123”不是int,而是int的string表示forms。

还有另一个区别。 “转换”总是被溢出检查,而“转换”可能取决于您的设置以及使用的“已选中”或“未选中”关键字。

要更明确。 考虑下面的代码:

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

那么目的地将是4没有警告。

但:

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

会给你一个例外。

并非所有types都支持转换

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

因为需要实现显式的操作符 。 但是.NET也提供了IConvertible接口 ,所以任何types实现的接口都可以转换成大多数的框架内置types。 最后,Convert类有助于用types化的IConvertible接口来操作。

一个强制转换只是告诉编译器,这个对象实际上是一个不同types的实现,并且像现在的新实现一样对待它。 而转换说,这不是从你想要转换的东西inheritance,但有一个方法来这样做。 例如,假设我们将“16”变成一个整数。 “16”是一个string,并不以任何方式从intinheritance。 但是,显而易见的是,“16”可以变成整数16。

Convert.ToInt32有很多重载,例如一个string。 当试图将一个string强制转换为一个int时会抛出一个编译错误。 重点是他们是为了不同的用途。 当你不确定你所投的对象是什么types时,转换特别有用。

投掷在我的2C – 似乎概念上的区别可能是有用的。 不是我是专家..:

铸造正在改变代表性的types。 所以“32”和32L以及32.0f似乎是合理的。 c#不会自动支持“32”,但大多数dynamic语言会。 所以我会使用(长)“32”或(string)32L。 当我可以。 我也有另一个规则 – 铸造应该是圆形可跳过的。

转换不一定是圆的,可以简单地创build一个全新的对象。

灰色区域是例如string“32xx”。 可以这样做,当你施放它的时候,它变成了32L(这个数字被parsing,直到它不能被parsing)。 Perl使用了这个。 但是这违反了我的往返要求。 32.5f到32L也是如此。 几乎所有的语言,包括非常静态types的语言都允许这样做,而且它也无法实现圆形可触发规则。 这是灰色的,如果你允许“32”被施放,那么在编译时你不知道它是否可能是“32xxx”。

可以做的另一个区别是只使用铸造“IsA”而不是“makeLookLikeA”。 所以,如果你知道一个string来自一个数据库,但实际上是一个非官方的模式中的int,可以随意使用一个强制转换(尽pipe在这种情况下,c#希望你使用转换)。 同样的情况也会出现浮动。 但是,当你只是使用转换来截断浮动。 这个区别也包含了DownCasting和UpCasting – 对象总是“IsA”,但是这个types可能已经被推广到列表中。

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

string号码=“123abc”;

int num;

Int32.TryParse(number,out num); //在这个调用中不会抛出exception

Convert.ToInt32(数); //在这个调用中抛出exception