Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时使用强制转换或转换_C#_Casting - Fatal编程技术网

C# 何时使用强制转换或转换

C# 何时使用强制转换或转换,c#,casting,C#,Casting,我很想知道,与使用Convert.ToInt32()相比,使用int进行转换有什么区别。使用它是否会提高性能 此外,每种情况应用于哪些情况?目前我更倾向于使用Convert,但我没有理由这样做。在我看来,他们都实现了同样的目标。请看另一个论坛 答复 下面的调用(阅读备注)。 因此,唯一的区别是,如果传递空字符串,它将返回0,而Int32.Parse将抛出ArgumentNullException 无论你用哪一种,这都是一个选择的问题 就个人而言,我两者都不使用,而且倾向于使用TryParse函数

我很想知道,与使用
Convert.ToInt32()
相比,使用
int
进行转换有什么区别。使用它是否会提高性能

此外,每种情况应用于哪些情况?目前我更倾向于使用
Convert
,但我没有理由这样做。在我看来,他们都实现了同样的目标。

请看另一个论坛

答复 下面的调用(阅读备注)。
因此,唯一的区别是,如果传递空字符串,它将返回
0
,而
Int32.Parse
将抛出
ArgumentNullException

无论你用哪一种,这都是一个选择的问题

就个人而言,我两者都不使用,而且倾向于使用
TryParse
函数(例如)


更新
顶部的链接已断开,请参见StackOverflow。

强制转换只是告诉编译器此对象实际上是另一种类型的实现,并将其视为新的实现。而convert则表示这并不是从您试图转换的对象继承的,但有一种固定的方法可以实现这一点。例如,假设我们将“16”转换为int。“16”是一个字符串,并且不会以任何方式从int继承。但是,很明显,“16”可以变成int 16

并非所有类型都支持像

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

因为它需要实施。但是.NET也提供了,所以实现该接口的任何类型都可以转换为大多数框架内置类型。最后,Convert类有助于操作类型实现IConvertible接口。

Convert.ToInt32有许多重载,例如字符串。当试图将字符串强制转换为int时,将抛出编译错误。关键是它们有不同的用途。当您不确定要从哪种类型投射对象时,“转换”尤其有用。

当对象确实是
int
类型时进行投射,当对象不是
int
但希望它成为一种类型时进行转换

例如
inti=(int)o当您知道o是int时

int i=Convert.ToInt32(“123”)
因为“123”不是一个int,它是一个int的字符串表示形式。

加入我的2c——看起来概念上的区别可能有用。并不是说我是专家

铸造正在改变代表类型。因此,“32”与32L和32.0f之间的转换似乎是合理的。c#不会自动支持“32”,但大多数动态语言会支持。所以我将使用(长)“32”或(字符串)32L。当我可以的时候。我还有另一条规则——施法应该是圆形的可折叠的

转换不必是圆形可折叠的,并且可以简单地创建一个全新的对象

例如,灰色区域是字符串“32xx”。有一种情况是,当您强制转换它时,它会变成32L(该数字被解析,直到无法转换为止)。Perl使用了这个。但这违反了我的往返要求。32.5f到32L也是如此。几乎所有的语言,包括非常静态类型的语言,都允许这样做,而且它也不符合循环可折叠规则。它是灰色的,如果您允许强制转换“32”,那么在编译时您不知道它是否可能是“32xxx”


另一个可以区分的是,只对“IsA”使用casting,而不是对“makeLookLikeA”使用casting。因此,如果您知道字符串来自数据库,但在非官方模式中实际上是int,请随意使用cast(尽管在本例中c#希望您使用Convert)。浮子也是如此。但不适用于仅使用强制转换截断浮点的情况。这种区别也解释了向下投射和向上投射的原因——对象始终是“IsA”,但该类型可能是列表的通用类型。

还有另一个区别。 “Convert”总是处于溢出选中状态,而“cast”可能处于溢出选中状态,具体取决于您的设置和使用的“checked”或“unchecked”关键字

更明确地说。 考虑代码:

int source = 260;
byte destination = (byte)source;
那么目的地将是4,没有警告

但是:


将给您一个例外。

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

int-num

Int32.TryParse(number,out num);//此调用未引发异常


将.ToInt32(数字);//这个调用抛出异常

重要:我最近注意到的另一个区别是“Cast”将1.63转换为1,其中as“Convert”将1.63转换为2。因此,基本上转换轮数和转换数,但cast会截断小数点后的值。有时TryParse不可用。Compact框架缺少TryParse:仅供参考@AbijeetPatro的评论,由Joseph Albahari和Ben Albahari从C#5.0简言之引用。版权所有2012约瑟夫·阿尔巴哈里和本·阿尔巴哈里,978-1-449-32010-2<代码>从浮点数转换为整数时,任何小数部分都会被截断;不进行舍入。静态类System.Convert提供了在各种数字类型之间转换时进行取整的方法
OP在哪里说过要转换字符串?如果强制转换是一个选项,那么它不能是一个字符串。我认为它与这个问题完全相同。这个问题询问何时使用强制转换或转换,下面的公认答案是:“无论您使用哪种转换,这实际上是一个选择问题。”我的问题专门询问强制转换和使用
convert.to()
之间的区别。因此,我的问题是对您问题的补充。这对使用枚举有何影响?这不是因为强制转换,而是转换规则。当您除以2个浮点数时,您将收到双精度值64.99999068677411,当强制转换为int时,它将仅截断为整数部分。但这将返回65:(int)(float)(a/b)),因为在float中它正好是65,而不是64.9
float a = 1.3f;
float b = 0.02f;
int c = (int)(a / b);
int d = Convert.ToInt32(a / b);`