2009-08-12 16 views
8

在VB.NET中使用CallByName function會有什麼缺點嗎?有沒有更好的方式在.NET 2.0以上的名稱進行調用。VB.NET中CallbyName函數的缺點?

+0

我不熟悉CallByName,你會在哪個上下文中使用它?你有一個例子嗎? – 2009-08-12 18:18:25

+0

CallByName將使用反射。所以,我不知道是否有其他方式。你能描述一下你使用CallByName的場景嗎?這將有助於確定,如果你需要CallByName或其他東西。 – shahkalpesh 2009-08-12 18:51:36

回答

7

CallByBame基本上給你提供了「後期綁定」,即「在運行時找出方法」,而不是「編譯器爲你提供的」早期綁定「。

使用早期綁定可以保證類型安全,因爲代碼將直接進入方法,所以性能會更好。編譯器會提前爲你「查找」。

由於該方法在運行時查找並且沒有類型安全性,這意味着該方法可能實際上並不存在,您可能會遇到異常,所以後期綁定性能較慢。但是,如果出於某種原因不知道對象的類型,這可能會很方便。我也用它來調用COM對象,如果我不想混淆互操作程序集。

CallByName很可能會調用Type.InvokeMember。如果您想直接做,這裏的一些代碼,我想出了:

Imports System.Reflection ' For access to BindingFlags ' 

Friend NotInheritable Class LateBinding 

    Private Const InvokePublicMethod As BindingFlags = BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.InvokeMethod 

    Private Const GetPublicProperty As BindingFlags = BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.GetProperty 

    Public Shared Function InvokeFunction(ByVal oObject As Object, ByVal sName As String, ByVal ParamArray yArguments() As Object) As Object 

     Return oObject.GetType().InvokeMember(sName, InvokePublicMethod, Nothing, oObject, yArguments) 

    End Function 

    Public Shared Function GetProperty(ByVal oObject As Object, ByVal sName As String, ByVal ParamArray yArguments() As Object) As Object 

     Return oObject.GetType().InvokeMember(sName, GetPublicProperty, Nothing, oObject, yArguments) 

    End Function 

End Class 
+1

「塞西爾有一個名稱」是正確的CallByName不緩存任何東西。如果您以這種方式重複調用相同的方法,則需要以某種方式緩存類型信息。如果你不這樣做,事情會真的放慢速度。 – 2009-08-25 12:53:00

2

如果CallByName函數不緩存方法綁定,這將是更好的選擇編寫存儲哈希表映射你自己的調度類名稱字符串到MethodInfo對象。