何时使用Cast或Convert

时间:2010-07-02 19:48:33

标签: c# casting

我很想知道与使用Convert.toInt32()相比,演员之间的区别是什么。使用一个可以获得某种性能提升吗?

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

9 个答案:

答案 0 :(得分:75)

当它真的是int类型时转换,当它不是int时转换,但你希望它成为一个。

例如{0}当你知道o是int

int i = (int)o;因为“123”不是int,所以它是int的字符串表示。

答案 1 :(得分:39)

请参阅另一个论坛上的Diff Between Cast and Convert

答案

  

下面的Convert.ToInt32(String, IFormatProvider)调用Int32.Parse(读取备注)   所以唯一的区别是,如果传递空字符串,则返回0,而Int32.Parse则抛出ArgumentNullException。   无论你使用哪个,这都是一个选择问题。

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


更新

顶部链接已损坏,请参阅StackOverflow上的this answer

答案 2 :(得分:11)

还有另一个区别。 "转换"总是溢出检查,而"演员"也许,取决于你的设置和"检查"或者"未经检查"关键字使用。

更明确。 考虑一下代码:

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

然后目的地将是4而没有警告。

可是:

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

会给你一个例外。

答案 3 :(得分:6)

并非所有类型都支持

之类的转换
int i = 0;
decimal d = (decimal)i;

因为需要实施explicit operator。但.NET也提供IConvertible interface,因此任何类型实现该接口都可以转换为大多数框架内置类型。最后,Convert类有助于使用类型实现IConvertible接口。

答案 4 :(得分:3)

演员只是告诉编译器这个对象实际上是一个不同类型的实现,现在就像新的实现一样对待它。虽然转换说这不会继承你想要转换的东西,但是有一套固定的方式。例如,假设我们将“16”转换为int。 “16”是一个字符串,不以任何方式从int继承。但是,很明显“16”可以变成int 16。

答案 5 :(得分:2)

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

Casting正在改变代表类型。所以“32”和32L以及32.0f在彼此之间施放是合理的。 c#不会自动支持“32”,但大多数动态语言都会支持。所以我将使用(长)“32”或(String)32L。什么时候能。我还有另一条规则 - 施法应该是圆形的。

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

灰色区域例如是字符串“32xx”。可以说一个案例,当你施放它时,它变成32L(该数字被解析直到它不可能)。 Perl用过这个。但这违反了我的往返要求。 32.5f至32L也是如此。几乎所有语言(包括非常静态类型的语言)都允许这样做,并且它也失败了圆形可触发规则。它是灰色的,如果你允许“32”被投射,那么在编译时你不知道它是否可能是“32xxx”。

可以做出的另一个区别是只使用“IsA”的转换而不是“makeLookLikeA”。因此,如果您知道字符串来自数据库但实际上是非官方模式中的int,请随意使用强制转换(尽管在这种情况下c#希望您仍然使用转换)。浮动也是如此。但不是因为你只是使用强制转换来截断浮动。这种区别也考虑了DownCasting和UpCasting - 对象总是'IsA',但该类型可能已经为列表推广。

答案 6 :(得分:1)

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

答案 7 :(得分: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

答案 8 :(得分:0)

字符串编号=" 123abc&#34 ;;

int num;

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

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

相关问题