TypeConverter vs. Convert vs. TargetType.Parse

M4N*_*M4N 39 .net c# type-conversion

据我所知,至少有3种方法可以在.NET中转换数据类型:


使用System.ComponentModel.TypeConverter

var conv = System.ComponentModel.TypeDescriptor.GetConverter(typeof(int));
var i1 = (int)conv.ConvertFrom("123");
Run Code Online (Sandbox Code Playgroud)

使用System.Convert.ChangeType():

var i2 = (int) Convert.ChangeType("123", typeof (int));
Run Code Online (Sandbox Code Playgroud)

使用目标类型的Parse/TryParse方法:

var i3 = int.Parse("123"); // or TryParse
Run Code Online (Sandbox Code Playgroud)



是否有任何指导方针或经验法则何时使用哪种方法在.NET基础数据类型之间进行转换(特别是从字符串到其他数据类型)?

Eld*_*rum 9

我要晚 6 年在这里发帖,因为我认为这是一个很好的问题,我对现有的答案不满意。

Parse/TryParse当您想从字符串转换为具有这些方法的类型时,才可以使用静态方法。(TryParse当您预计转换可能失败时使用)。

的点System.Convert是,作为其文件说,转换从一个基本数据类型到另一个基站的数据类型。请注意,使用 Convert 您还有一些方法,这些方法可以Object自行确定如何转换它。

至于System.ComponentModel.TypeConverter,作为“typeconverter”堆栈溢出标记的文档,当您想要提供类实例的文本表示以供设计器序列化使用或在属性网格中显示时,它们主要用于在字符串之间进行转换。


Şaf*_*Gür 5

转变

Convert类使用目标类型中实现的IConvertible方法。

不幸的是,实现IConvertible意味着编写大量样板代码,如果目标类型是结构,则Convert.ChangeType会导致装箱。

类型转换器属性

TypeDescriptor.GetConverter使用TypeConverterAttribute,恕我直言,它既提供了更好的 API 来转换类型,又提供了一种更优雅的方式来使类型可转换。但是由于Convert方法不是通用的,它遇到了与类相同的性能问题。

解析/尝试解析

使用T.Parse/T.TryParse方法是从字符串创建对象的事实上的方法,因为它不涉及不必要的装箱。它们通常还有重载,可以更好地控制如何解析字符串。

TryParse 方法允许您处理您要解析的字符串是从用户输入或其他不能保证正确格式化字符串的方式获得的情况,而不会抛出异常。


因此,您应该尽可能调用类型的Parse/TryParse方法并且仅当您在编译时不知道目标类型时才回退到其他方式,即当您只有一个代表您的目标类型的Type对象时。

您还可以查看我的名为ValueString 的小库,它会找到最合适的类型解析方法并使用它来解析字符串。