Почему открытые поля и свойства взаимозаменяемо совместимы? - PullRequest
5 голосов
/ 26 мая 2010

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

Теперь я не эксперт COM, но у меня сложилось впечатление, что каждый экспонированный элемент в классе получает свой GUID. Поскольку мы собирались перейти от ситуации, когда каждое значение переходило от 2 Guids (Property Get и Property Let) к одному, где они использовали только одно (открытое поле), я ожидал, что это нарушит двоичную совместимость - но, похоже, это не сделал этого.

Кто-нибудь может объяснить, почему?

Ответы [ 2 ]

6 голосов
/ 26 мая 2010

Нет, у него нет нарушенной совместимости, потому что не имеет удаленного свойства get и метода let свойства. Просто сейчас компилятор пишет их для вас.

Разве это не одна из немногих областей, где VB6, возможно, лучше , чем .Net?

  • В общедоступных полях .Net ведут себя иначе, чем публичные свойства, и это затрудняет некоторые рефакторинги и вызывает путаницу .
  • В VB6 открытые поля ведут себя точно так же, как открытые свойства, поэтому переключение возможно без влияния на двоичную совместимость. За кулисами компилятор генерирует свойство get и устанавливает процедуры для открытых полей. В некотором смысле VB6 автоматически реализовал свойства (теперь объявляет как "новую функцию" в VB10) ...
1 голос
/ 26 мая 2010

Я думаю, что это немного тоньше, чем это. Вы получаете GUID для интерфейса COM (не каждое отдельное поле / метод). Насколько я понимаю, двоичная совместимость пытается сработать, если интерфейс, который вы сейчас компилируете, обратно совместим с эталонной версией вашей DLL (если она у вас есть) и изменяет GUID, только если они несовместимы.

Поэтому я также удивлен тем, что он решил удалить все методы get / set совместимо: /

...