2009-08-12 2 views
8

Есть ли недостатки в производительности при использовании CallByName function в VB.NET? Есть ли лучший способ выполнить вызов по имени в .NET 2.0 и далее.Недостатки функции CallbyName в VB.NET?

+0

Я не знаком с CallByName, в каком контексте вы его используете? У вас есть пример? –

+0

CallByName будет использовать отражение. Итак, я не знаю, есть ли другой способ. Не могли бы вы описать сценарий, в котором вы используете CallByName? Это поможет определить, если вам нужно CallByName или что-то еще. – shahkalpesh

ответ

7

CallByBame в основном дает вам «позднюю привязку», которая «вычисляет метод во время выполнения», в отличие от «раннего связывания», когда компилятор определяет это для вас.

С ранним связыванием вы можете быть безопасным по типу, и у вас будет более высокая производительность, так как ваш код пойдет прямо к методу. Компилятор будет «искать его» для вас раньше времени.

С более поздним временем выполнения привязки медленнее, так как метод проверяется во время выполнения, и у вас нет безопасности типа, что означает, что метод может фактически не существовать, и вы можете получить исключение. Но это может быть удобно, если вы не знаете тип объекта по какой-то причине. Я также использую его для вызова COM-объекта, если я не хочу вмешиваться в сборку interop.

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 не кэширует что-либо. Если вы неоднократно вызываете одни и те же методы таким образом, вам нужно каким-то образом кэшировать информацию о типе. Вещи могут действительно замедлить, если вы этого не сделаете. –

2

Если функция CallByName не метод привязки кэша, было бы гораздо лучше, чтобы написать свой собственный класс доставки, который хранит хэш-таблицу для отображения имена строк до MethodInfo объектов.

Смежные вопросы