有关VB.NET的弱类型和后期绑定

前天应邀在.NET下处理HTML DOM,就按照原来VB中的写:

Dim document = WebBrowser1.Document.DomDocument
MsgBox(document.getelementbyid(“aaaaa”).innerhtml)

工作很正常。然而同学却不懂VB,就翻译成C#,写成

Object document = WebBrowser1.Document.DomDocument
document.getelementbyid(“aaaaa”).innerhtml

结果没法通过编译。网上搜了下,有人说把Object换成var,试了下也不行。

后来查了下MSDN中C#的入门,提到了“C#是强类型语言”,所以,像脚本那样访问DOM是不行的,必须要Cast以后才行,方始发现原来VB和C#还是不一样的啊。

然而.NET终归是一种语言,VB和C#的这个差别在.NET上会是什么样的呢。大家都知道,.NET的母语是C#,换句话说.NET IL也是强类型语言,所以推测是VB的编译器做了手脚。

用Reflactor打开VB编译的EXE,果然不出所料。

如下面的代码:

Dim document = WebBrowser1.Document.DomDocument
document.parentwindow.execscript("alert(jQuery(""table:eq(1) tr:gt(0) td:nth-child(2)"").text());", "javascript")

在Reflactor中变成了:

NewLateBinding.LateCall(NewLateBinding.LateGet(RuntimeHelpers.GetObjectValue(Me.WebBrowser1.Document.DomDocument), Nothing, "parentwindow", New Object(0  – 1) {}, Nothing, Nothing, Nothing), Nothing, "execscript", New Object() { "alert(jQuery(""table:eq(1) tr:gt(0) td:nth-child(2)"").text());", "javascript" }, Nothing, Nothing, Nothing, True)

这么看来VB.NET支持IDispatch的后期绑定,倒是比C#还技高一筹哈哈

Leave a Reply

Your email address will not be published. Required fields are marked *