Как VB.NET разрешает это свойство объекта?

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

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

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

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


person Matt Whitfield    schedule 15.02.2012    source источник


Ответы (4)


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

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

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

person Harsh    schedule 15.02.2012
comment
Хорошо, спасибо - но есть ли где-нибудь ссылка, которая могла бы точно описать мне, как это работает? Потому что мне нужно преобразовать этот код в C #, и я хотел бы воспроизвести функциональность разумным способом (то есть без использования отражения, если это вообще возможно) ... - person Matt Whitfield; 15.02.2012
comment
Взгляните на эту ссылку msdn msdn.microsoft.com/en-us/library/ 0tcf61s1.aspx - person Harsh; 15.02.2012
comment
Это поможет вам выполнить позднее связывание в C # kristofmattei.be/2010/02 / 11 / c-позднее связывание - person Harsh; 15.02.2012
comment
Взгляните на stackoverflow.com/questions/8225328/ и vbforums .com / showthread.php? t = 421966 - person Harsh; 15.02.2012
comment
Спасибо. Информативно - хотя я почти уверен, что это заставляет младенца Иисуса немного плакать каждый раз, когда его используют! :) - person Matt Whitfield; 15.02.2012
comment
+1. И если вам не нравится эта функция, и я должен признать, что ненавижу ее, используйте Option Strict On, чтобы отключить ее. К сожалению, Microsoft заявляет, что мы можем » нет динамического ключевого слова в VB - person MarkJ; 15.02.2012

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

return ((dynamic)SourceObject).Name;
person Vimal Raj    schedule 15.02.2012

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

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

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

person jmoreno    schedule 16.02.2012
comment
Да, я планирую повторить это с помощью строгой типизации, но перед тем, как приступить к рефакторингу чего-то, мне хотелось бы узнать, как это на самом деле работает ... - person Matt Whitfield; 17.02.2012

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

person Derek Tomes    schedule 15.02.2012
comment
Да, полностью осознаю это. Вот почему я хочу понять, как это работает, чтобы избавиться от поведения. - person Matt Whitfield; 18.02.2012