Недостатки функции CallbyName в VB.NET?

Предпочтительный Путь (потому что это инфраструктура команда; предназначенный, чтобы быть программным):

$ git diff-tree --no-commit-id --name-only -r bd61ad98
index.html
javascript/application.js
javascript/ie6.js

Иначе (менее предпочтительный для сценариев, потому что это фарфор команда; предназначенный, чтобы быть направлением пользователя)

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js
<час>
  • Эти --no-commit-id подавляет идентификационный вывод фиксации.
  • --pretty аргумент указывает пустую строку формата для предотвращения хлама вначале.
  • --name-only аргумент показывает только имена файлов, которые были затронуты (Спасибо Моток). Используйте --name-status вместо этого, если Вы хотите видеть то, что произошло с каждым файлом ( Deleted, Modified, А dded)
  • -r, аргумент должен рекурсивно вызвать в поддеревья
8
задан John Saunders 13 August 2009 в 10:24
поделиться

2 ответа

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
7
ответ дан 5 December 2019 в 19:01
поделиться

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

2
ответ дан 5 December 2019 в 19:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: