有谁知道VB中的一种快捷方式,从字符串到T
约束为一个值类型(Of T as Structure
),当我知道T
将永远是一些数字类型?当T是一个valuetype时,将字符串转换为泛型类型T的更快捷方式是什么?
这是对我的口味过于缓慢:
Return DirectCast(Convert.ChangeType(myStr, GetType(T)), T)
但它似乎是从String
获得的唯一理智的方法 - >T
。我试过使用反射器来看看Convert.ChangeType
是如何工作的,虽然我可以通过该代码的黑客版本从字符串转换为给定的数字类型,但我不知道如何将该类型重新插入T
,以便它可以被退回。
我将添加我看到的速度惩罚的一部分(在一个时间循环中)是因为返回值被赋值为Nullable(Of T)
值。如果我强烈地键入我的班级的特定数字类型(即UInt16
),那么我可以大大提高性能,但是对于我使用的每种数字类型,该班级都需要重复。
如果在通用方法/类中使用/从T
进行转换时,它几乎会很好。也许有,我忘了它的存在?
结论:
测试以下三个提供的实现和我原来的DirectCast /一changeType形式,使用准备好的委托来从一个基本类型作品Parse
方法@ peenut的做法。但是,没有进行错误检查,所以实现者需要记住只在具有可用的Parse
方法的值类型中使用它。或者扩展下面的错误检查。
所有运行都是在运行带有4GB内存的Windows Server 2003 R2的32位系统上完成的。每个“运行”是要测试的方法的1,000,000个执行(ops),使用StopWatch进行计时并以毫秒为单位进行报告。
原始DirectCast(Convert.ChangeType(myStr, GetType(T)), T)
:
1000000 ops: 597ms
Average of 1000000 ops over 10 runs: 472ms
Average of 1000000 ops over 10 runs: 458ms
Average of 1000000 ops over 10 runs: 453ms
Average of 1000000 ops over 10 runs: 466ms
Average of 1000000 ops over 10 runs: 462ms
使用System.Reflection
,并呼吁InvokeMethod
获得在Parse
方法:
1000000 ops: 12213ms
Average of 1000000 ops over 10 runs: 11468ms
Average of 1000000 ops over 10 runs: 11509ms
Average of 1000000 ops over 10 runs: 11524ms
Average of 1000000 ops over 10 runs: 11509ms
Average of 1000000 ops over 10 runs: 11490ms
康拉德的方法来生成IL代码来访问Parse
方法和存储呼叫进入代表:
peenut的方式来访问Parse
方法直接:
1000000 ops: 272ms
Average of 1000000 ops over 10 runs: 272ms
Average of 1000000 ops over 10 runs: 275ms
Average of 1000000 ops over 10 runs: 274ms
Average of 1000000 ops over 10 runs: 272ms
Average of 1000000 ops over 10 runs: 273ms
相比之下,peenut的做法几乎是200毫秒更快紧密循环执行1,000,000次的时候,所以他的做法胜出。尽管康拉德并不遥远,并且本身就是一个像ILGenerator这样的迷人研究。道具所有谁贡献!
我想你错过了什么,我试图做的。假设一个泛型方法`Public Function Foo(Of T As Structure)(ByVal str As String)As T`。我必须返回类型`T`,大概是泛型类中的变量(`Dim tmp As T`)。如果在`Foo`中,我做了`Dim tmpDbl As Double = Double.Parse(str)`,那么当我尝试`返回tmpDbl`时,IDE会抛出一个错误,因为Double不能转换为`T`。因此,我的原始文章中列出的`DirectCast` /`Convert.ChangeType`组合很慢。 – Kumba 2011-01-13 03:02:11
谢谢,这就是我错过的一点 - 这个泛型可以在其他泛型类中使用。 – Snowbear 2011-01-13 13:20:28