2012-02-15 5 views
2

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

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

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

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

ответ

6

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

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

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

+0

Хорошо спасибо - но есть ли где-нибудь ссылка, которая может описать мне, как это работает? Потому что мне нужно преобразовать этот код в C#, и я хотел бы реплицировать функциональность разумным способом (т. Е. Не использовать отражение, если это вообще возможно) ... –

+0

Имейте ссылку на эту ссылку msdn http://msdn.microsoft.com /en-us/library/0tcf61s1.aspx – Harsh

+0

Это поможет вам сделать последнее связывание в C# http://kristofmattei.be/2010/02/11/c-late-binding/ – Harsh

3

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

return ((dynamic)SourceObject).Name; 
1

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

+0

Да, полностью осознавая это. Вот почему я хочу понять, как это работает, поэтому я могу избавиться от поведения. –

2

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

Таким образом, эквивалент C# код будет ((dynamic) sourceObject).Name

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

+0

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