Как VB.NET разрешает это свойство объекта? - PullRequest
2 голосов
/ 15 февраля 2012

Хорошо, так что я программист на C #, и у меня проблемы даже с чтением VB.NET, поэтому, пожалуйста, простите, что может оказаться невероятно глупым вопросом.Но у меня есть некоторый код, который выглядит следующим образом:

Function GetName(sourceObject as Object) as String
    return sourceObject.Name
End Function

Итак, игнорируя тот факт, что синтаксис, вероятно, неправильный - как VB.NET получает свойство Name из sourceObject?Проверка его во время выполнения показывает, что sourceObject относится к типу, который поддерживает свойство с именем get с помощью метода get, но что делает в этом случае VB.NET?Есть ли какой-то дополнительный код, который генерируется компилятором, чтобы каким-то образом приводить его автоматически во время выполнения?

Как вы можете сказать, я немного запутался.Заранее спасибо!

Ответы [ 4 ]

6 голосов
/ 15 февраля 2012

Это случай позднего связывания.Таким образом, если sourceObject содержит свойство в качестве имени, он вернет значение, в противном случае он просто выдаст ошибку, свойство не найдено.

Позднее связывание в C # требует отражения, поэтому оно выдает ошибку времени компиляции, тогда как в vb.net это можно сделать без отражения.

Компилятор Visual Basic выполняет процесс, называемый связыванием, когда объект назначается переменной объекта.Объект рано связывается, когда он назначается переменной, объявленной как объект определенного типа.Объекты с ранней привязкой позволяют компилятору распределять память и выполнять другие оптимизации перед выполнением приложения.В отличие от этого, объект привязывается поздно, когда он назначается переменной, объявленной как тип Object.Объекты этого типа могут содержать ссылки на любой объект.

3 голосов
/ 15 февраля 2012

Если вы используете c # 4.0, вы можете попробовать это.

return ((dynamic)SourceObject).Name;
2 голосов
/ 16 февраля 2012

Из-за присущей поздней привязки все переменные VB типа Object эквивалентны объектам c #, которые были преобразованы в динамические - или, другими словами, c # добавил динамические значения для получения функциональной четности с VB.

Итак, эквивалентный код c # будет ((dynamic) sourceObject).Name

Я бы хотел сделать это с помощью Generics или интерфейса, если это возможно, так как это более чистый дизайн.

1 голос
/ 15 февраля 2012

Просто имейте в виду, что Позднее связывание VB обходит проверку типов с вашим компилятором. Если передаваемый объект не имеет свойства Name, во время выполнения может возникнуть исключение.

...