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以下几点:
-
Convert
。 当我绝对确信价值将会是我所期望的时候,我会使用它。int i = Convert.ToInt32("123");
-
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。