我有一种情况,我需要使用:?>
在一个程序中向下转发两次。我有一个自定义EventArgs
类(继承System.EventArgs
),以及该自定义EventArgs
中的抽象类实例。收到活动后,我需要垂头丧气两次。一次用于自定义EventArgs
,一次用于该自定义EventArgs
中的抽象类。我每天必须做数百万次这样的事情,所以我想知道是否有任何关于向下倾斜的内在缓慢。
答案 0 :(得分:4)
对于笑话,我把以下小功能放在一起:
let castToStream (o:Object) = o :?> Stream
并使用以下代码调用它:
[<EntryPoint>]
let main argv =
let stm1 = new FileStream("output.tmp", FileMode.Create, FileAccess.ReadWrite, FileShare.Read)
let obj = stm1 :> Object
let stm2 = castToStream obj
0 // return an integer exit code
编译时,castToStream
变成了这个IL:
.method public static class [mscorlib]System.IO.Stream
castToStream(object o) cil managed
{
// Code size 8 (0x8)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: unbox.any [mscorlib]System.IO.Stream
IL_0007: ret
} // end of method Program::castToStream
在这种情况下实际上是1个实际指令,unbox.any。 Unbox.any用于引用类型等同于castclass指令。从the description开始,如果某个类型尚未加载,您将进行一次性初始点击以加载该类型,然后它将成为确定是否需要的任何魔法类型是等价的(可能使用Type.IsAssignableFrom(),但我不确定)。但是,除非您的类层次结构非常深(并且它不应该),否则我希望在典型的计算机上采用微秒。
对于好奇,我最初有castToStream内联的代码,但f#编译器通过我的恶作剧看到并完全删除了所有的转换。