TypeConverter与转换与TargetType.Parse

据我所知,在.NET中至less有三种转换数据types的方法:


使用System.ComponentModel.TypeConverter

var conv = System.ComponentModel.TypeDescriptor.GetConverter(typeof(int)); var i1 = (int)conv.ConvertFrom("123"); 

使用System.Convert.ChangeType() :

 var i2 = (int) Convert.ChangeType("123", typeof (int)); 

使用目标types的Parse / TryParse方法:

 var i3 = int.Parse("123"); // or TryParse 


有什么指导方针或经验法则何时使用哪种方法在.NET基本数据types(特别是从string到其他数据types)之间进行转换?

根据我的个人喜好和编码标准,我select以下几点:

  1. Convert 。 当我绝对确信价值将会是我所期望的时候,我会使用它。

     int i = Convert.ToInt32("123"); 
  2. TryParse 。 我在处理用户input时使用这个。 这也有利于在parsing时使用本地化的格式。

     int i = 0; bool parsed = Int32.TryParse("123", out i); 

也有可能使用TryParseExact,其中可以parsing某个模式。 在某些情况下可能有用。

刚刚发现了一个TypeConvert.ConvertFrom(object)引发exception的情况。 如果你想把整数0/1转换成布尔值。 您将使用TypeConvert.ConvertFrom(1)(0)获得exception。 在这种情况下, Convert.ChangeType(1, System.Boolean)起作用。

一般来说,你应该完全避免Convert类。 有理由使用它(例如,你不知道源types),但如果你已经知道你的源types是一个string然后Parse (或更准确地说, TryParse )总是正确的方法来使用。

至于types转换器,当一个框架(如WPF)使用reflection来确定正确types的转换器时,它们通常比不被使用。

你忘了另一种转换方式,那就是直投。 以此代码为例

 object i = 1; int myInt = (int)i; 

这是一个有点人为的例子,但我已经知道i是一个整数,只是它被装进一个object 。 在这种情况下,我不需要转换i ,我只需要直接将其转换为我知道它已经是的types。

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

静态的Parse/TryParse方法只能用于当你想从string转换为具有这些方法的types 。 (如果您预计转换可能失败,请使用TryParse )。

正如其文档所述 , System.Convert的要点是将基础数据types转换为另一基础数据types 。 请注意,使用Convert也可以获取一个Object并自行找出如何转换的方法。

至于System.ComponentModel.TypeConverter ,作为“typeconverter”堆栈溢出标签的文档 ,当你想提供一个类实例的文本表示 ,供devise器序列化使用或者显示时,它们主要用于转换string和string 物业网格

我几乎总是使用int / double / etc.Parse()方法,当我确定它是一个数字。 在任何怀疑的情况下,我们将.TryParse()方法作为一个包括parsing和检查在内的一体化解决scheme。 我有这种感觉,检查和parsing相结合比单独做他们稍微高性能。

TypeConverter可能只在编译时不知道types时才有用。

兑换

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

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

TypeConverterAttribute

TypeDescriptor.GetConverter使用TypeConverterAttribute ,恕我直言,提供了一个更好的API转换types和一个更优雅的方式,使一个types可转换。 但是,由于方法不是通用的,导致Convert类遇到了相同的性能问题。

parsing/的TryParse

使用T.Parse / T.TryParse方法是从string创build对象的实际方法,因为它不涉及不必要的装箱。 它们通常也有重载,可以更好地控制如何parsingstring。

TryParse方法允许你处理你想要parsing的string是从用户input中获得的,或者另一个意思是不保证格式正确的string,而不会抛出exception。


所以, 当你可以的时候,你应该调用types的Parse / TryParse方法并且只有当你不知道编译时的目标types时,也就是只有一个Type对象表示你的目标types时,才可以TryParse其他方式。

你也可以看看我的小库叫做ValueString ,它find了一个types的最合适的parsing方法,并用它来parsingstring。