Все на початку обмежено C #, якщо ви не пройдете інтерфейс Reflection.
Рання прив'язка просто означає, що цільовий метод знайдений під час компіляції, і створюється код, який викликатиме це. Незалежно від того, віртуальний він чи ні (це означає, що є додатковий крок, щоб знайти його під час дзвінка, не має значення). Якщо метод не існує, компілятор не зможе скомпілювати код.
Пізній зв’язок означає, що цільовий метод шукається під час виконання. Часто для його пошуку використовують текстову назву методу. Якщо методу немає, бах. Програма виведе з ладу або перейде в якусь схему обробки винятків під час роботи.
Більшість мов сценаріїв використовують пізнє прив'язування, а компільовані мови використовують раннє прив'язку.
C # (до версії 4) не запізнюється; однак вони можуть використовувати для цього API відображення. Цей API компілюється в код, який шукає імена функцій, перекопуючи збірки під час виконання. VB може запізнитися, якщо Option Strict вимкнено.
Зв'язування зазвичай впливає на продуктивність. Оскільки пізнє прив'язування вимагає пошуку під час виконання, це, як правило, означає, що виклики методів є повільнішими, ніж виклики методів, що прив'язані до початку.
Для нормальної функції компілятор може обробити числове розташування його в пам'яті. Тоді він, коли функція викликається, може генерувати вказівку викликати функцію за цією адресою.
Для об'єкта, який має будь-які віртуальні методи, компілятор генерує v-таблицю. По суті, це масив, що містить адреси віртуальних методів. Кожен об'єкт, який має віртуальний метод, буде містити прихований член, сформований компілятором, який є адресою v-таблиці. Коли викликана віртуальна функція, компілятор визначить, яке положення займає відповідний метод у v-таблиці. Потім він генерує код для пошуку в об’єктах v-table та викликає віртуальний метод у цій позиції.
Отже, існує пошук, який відбувається для віртуальної функції. Це сильно оптимізовано, тому це буде відбуватися дуже швидко під час виконання.
Рано зв'язаний
- Компілятор може визначити, де буде викликана функція під час компіляції.
- Компілятор може завчасно гарантувати (до запуску будь-якого програмного коду), що функція буде існувати та буде викликана під час виконання.
- Компілятор гарантує, що функція приймає потрібну кількість аргументів і що вони мають правильний тип. Він також перевіряє, чи повертається значення правильного типу.
Пізньо-обов’язковий
- Пошук триватиме довше, оскільки це не простий обчислювальний зсув, як правило, потрібно зробити порівняння тексту.
- Цільова функція може не існувати.
- Цільова функція може не приймати аргументи, передані їй, і може мати повернене значення неправильного типу.
- У деяких реалізаціях цільовий метод може фактично змінюватися під час виконання. Отже, пошук може виконувати іншу функцію. Я думаю, що це відбувається в мові Ruby, ви можете визначити новий метод на об'єкті під час роботи програми. Пізнє прив'язування дозволяє викликам функцій почати виклик нового перевизначення для методу замість виклику існуючого базового методу.