何时使用Cast或Convert
我很好奇,知道什么之间的差异之间的演员说一个int相比,使用Convert.toInt32()。 使用一个有什么样的性能增益?
还应该分别使用哪种情况。 目前我更倾向于使用转换,但我没有理由去任何方式。 在我看来,我看到他们都实现了同样的目标。
在另一个论坛上查看演员和转换之间的差异
回答
下面的
Convert.ToInt32(String, IFormatProvider)
调用Int32.Parse
(读取注释)。
所以唯一的区别是,如果传递一个空string,它返回0
,而Int32.Parse
抛出一个ArgumentNullException
。
无论你使用什么,这都是一个真正的问题。
就个人而言,我既不使用,也倾向于使用TryParse
function(例如System.Int32.TryParse()
)。
UPDATE
顶部链接已损坏,请在StackOverflow上查看此答案 。
当它是一个int
types时进行投射,当它不是一个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