Раннее и позднее связывание

Объявлены эти строки до device.connectGatt()

    AdvertiseSettings advertiseSettings = new AdvertiseSettings.Builder()
            .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
            .setConnectable(true)
            .setTimeout(0)
            .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
            .build();
    AdvertiseData advertiseData = new AdvertiseData.Builder()
            .setIncludeDeviceName(true)
            .setIncludeTxPowerLevel(false)
            .addServiceUuid(new ParcelUuid(FP_SERVICE_UUID))
            .build();
    mBluetoothAdapter.getBluetoothLeAdvertiser().startAdvertising(advertiseSettings, advertiseData, new AdvertiseCallback() {
        @Override
        public void onStartSuccess(AdvertiseSettings settingsInEffect) {
            super.onStartSuccess(settingsInEffect);
            // Log.d(TAG, "BluetoothLeAdvertiser, onStartSuccess --> $isConnectable : " + settingsInEffect.isConnectable());
        }

        @Override
        public void onStartFailure(int errorCode) {
            super.onStartFailure(errorCode);
            // Log.d(TAG, "BluetoothLeAdvertiser, onStartSuccess --> errorCode : " + errorCode);
        }
    });
...
79
задан Cybermaxs 28 September 2012 в 09:11
поделиться

3 ответа

Все рано связывается в C#, если Вы не проходите интерфейс Reflection.

Ранний связанный просто означает, что целевой метод найден во время компиляции, и код создается, который назовет это. Не важно ли его виртуальное или не (значение существует дополнительный шаг для нахождения его во время вызова). Если метод не будет существовать, то компилятор не скомпилирует код.

Поздний связанный означает, что целевой метод ищется во время выполнения. Часто текстовое название метода используется для поиска его. Если метод не там, удар. Программа откажет или войдет в некоторую схему обработки исключений во время выполнения.

Большинство языков сценария использует позднее связывание, и скомпилированные языки используют раннее связывание.

C# (до версии 4) поздно не связывает; они могут однако использовать API Reflection, чтобы сделать это. Те компиляции API для кодирования, который ищет имена функций путем рытья посредством блоков во время выполнения. VB может поздно связать, если Строгая Опция выключена.

Привязка обычно имеет эффект на производительность. Поскольку позднее связывание требует поисков во времени выполнения, это обычно - вызовы метода средств, медленнее, чем ранние вызовы связанного метода.

<час>

Для нормальной функции, компилятор может разработать числовое местоположение его в памяти. Затем она, когда функция вызвана это, может генерировать инструкцию вызвать функцию в этом адресе.

Для объекта, который имеет любые виртуальные методы, компилятор генерирует v-таблицу. Это - по существу массив, который содержит адреса виртуальных методов. Каждый объект, который имеет виртуальный метод, будет содержать скрытого участника, сгенерированного компилятором, который является адресом v-таблицы. Когда виртуальная функция будет вызвана, компилятор разработает то, что положение имеет соответствующий метод в v-таблице. Это затем сгенерирует код, чтобы посмотреть в v-таблице объектов и назвать виртуальный метод в этом положении.

Так, существует поиск, который происходит для виртуальной функции. Это в большой степени оптимизировано так, это произойдет очень быстро во времени выполнения.

Ранний связанный

  • компилятор может разработать, где вызванная функция будет во время компиляции.
  • компилятор может гарантировать рано (прежде чем любое из выполнений кода программ), что функция будет существовать и будет вызываемой во времени выполнения.
  • компилятор гарантирует, что функция берет правильное количество аргументов и что они имеют корректный тип. Это также проверяет, что возвращаемое значение имеет корректный тип.

Позднее связывание

  • поиск займет больше времени, потому что не простое вычисление смещения, обычно существуют текстовые сравнения, которые будут сделаны.
  • целевая функция не может существовать.
  • целевая функция не может признать, что аргументы передали ей и могут иметь возвращаемое значение неправильного типа.
  • С некоторыми реализациями, целевой метод может на самом деле измениться во времени выполнения. Так, поиск может выполнить другую функцию. Я думаю, что это происходит на языке Ruby, можно определить новый метод на объекте, в то время как программа работает. Позднее связывание позволяет вызовам функции начать называть новое переопределение для метода вместо того, чтобы назвать существующий базовый метод.
98
ответ дан Cody Gray 24 November 2019 в 10:16
поделиться

C# 3 использует раннее связывание.

C# 4 добавляет позднее связывание с dynamic ключевое слово. См. запись в блоге Chris Burrow на предмете для деталей.

Что касается виртуального по сравнению с невиртуальными методами, это - другой вопрос. Если я звоню string.ToString(), код C# связывается с виртуальным object.ToString() метод. Код вызывающей стороны не изменяется на основе типа объекта. Скорее виртуальные методы называют через таблицу указателей функции. Объект-экземпляр относится к таблице объекта, указывающей на, он ToString() метод. Экземпляр строки имеет, это - таблица виртуальных методов, указывающая на, он ToString() метод. Да, это - полиморфизм. но это не позднее связывание.

17
ответ дан Ian R. O'Brien 24 November 2019 в 10:16
поделиться

Эта статья представляет собой руководство по созданию компонента .net, его использованию в проекте Vb6 во время выполнения с использованием позднего связывания, присоединения его событий и получения обратного вызова.

http://www.codeproject.com/KB/cs/csapivb6callback2.aspx

Эта статья представляет собой руководство по созданию компонента .NET и его использованию в проекте VB6. Есть много примеров по этой проблеме, так почему я написал новый? По моему скромному мнению, в других статьях недостающей частью является прикрепление его события во время выполнения. Итак, в этой статье мы создадим компонент .NET, отметим его как видимый компонент COM, будем использовать его во время выполнения в VB6 и присоединим к его событиям.

https://www.codeproject.com/Articles/37127/Internet-Explorer-Late-Binding-Automation

Большинству разработчиков часто требуется автоматизация Internet Explorer, что в основном означает открытие браузера, заполнение некоторых форм и публикацию данные программно.

Наиболее распространенным подходом является использование shdocvw.dll (элемент управления Microsoft Web Browser) и Mshtml.dll (компонент анализа и рендеринга HTML) или Microsoft.Mshtml.dll, который на самом деле является оболочкой .NET для Mshtml.dll. . Вы можете получить дополнительную информацию об Internet Explorer - о браузере здесь.

Если вы выберете вышеуказанный метод и библиотеки DLL, давайте посмотрим на некоторые проблемы, с которыми вы, возможно, столкнетесь:

Вы должны распространять эти библиотеки DLL, потому что ваш проект будет зависеть от этих библиотек DLL, и это серьезная проблема. если вы не можете их правильно развернуть. Просто поищите в Google проблемы с распространением shdocvw и mshtml.dll, и вы поймете, о чем я говорю. Вам нужно развернуть Microsoft.mshtml.dll 8 МБ, потому что эта DLL не является частью .NET framework. В этом случае нам нужно использовать технику позднего связывания. Написание собственных оболочек для вышеупомянутых DLL. И, конечно же, мы сделаем это, потому что это более полезно, чем использование этих DLL. Например, нам не нужно проверять, завершена ли операция загрузки документа, потому что IEHelper сделает это за нас.

1
ответ дан 24 November 2019 в 10:16
поделиться
Другие вопросы по тегам:

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