何时使用Cast或Convert

Gag*_*age 75 c# casting

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

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

Gre*_*reg 76

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

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

int i = Convert.ToInt32("123") 因为"123"不是int,所以它是int的字符串表示.


Dav*_*vid 39

请参阅另一个论坛上的差异转换和转换

回答

Convert.ToInt32(String, IFormatProvider)下面调用Int32.Parse(读的话).
所以唯一的区别是,如果传递一个空字符串,它会返回0,而Int32.Parse抛出一个ArgumentNullException.
无论您使用哪种方式,这都是一个选择问题.

就个人而言,我既不使用,也倾向于使用这些TryParse功能(例如System.Int32.TryParse()).


UPDATE

顶部的链接已损坏,请参阅StackOverflow上的此答案.

  • **重要**:我最近注意到的另一个区别是"Cast"会将1.63转换为1,其中"转换"将1.63转换为2.因此,基本上转换轮次以及转换但在小数点后转换截断值. (68认同)
  • 紧凑架构缺少的TryParse:http://stackoverflow.com/questions/22670260/does-the-net-compact-framework-have-the-tryparse-methods-where-is-the-document (3认同)
  • 仅供参考 @AbijeetPatro 的评论,引用自 C# 5.0 in a Nutshell by Joseph Albahari 和 Ben Albahari。版权所有 2012 Joseph Albahari 和 Ben Albahari,978-1-449-32010-2。`当您从浮点数转换为整数时,任何小数部分都会被截断;不进行四舍五入。静态类 System.Convert 提供了在各种数字类型之间转换时进行舍入的方法 (2认同)

Seb*_*Seb 11

还有另一个不同之处."转换"始终是溢出检查,而"转换"可能是,取决于您的设置和使用的"已选中"或"未选中"关键字.

更明确.考虑一下代码:

int source = 260;
byte destination = (byte)source;
Run Code Online (Sandbox Code Playgroud)

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

但:

int source = 260;
byte destination = Convert.ToByte(source);
Run Code Online (Sandbox Code Playgroud)

会给你一个例外.


STO*_*STO 6

并非所有类型都支持转换

int i = 0;
decimal d = (decimal)i;
Run Code Online (Sandbox Code Playgroud)

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