В VB6, в чем разница между набором свойств и свойством Let? - PullRequest
34 голосов
/ 18 февраля 2011

Я только что создал несколько Property Set методов, и они не компилировались.Когда я изменил их на Property Let, все было хорошо.

С тех пор я изучил документацию, чтобы найти разницу между Property Set и Property Let, но должен признать, что не был мудрее.Есть ли какая-то разница, и если да, то может ли кто-нибудь предложить указатель на правильное объяснение этого?

Ответы [ 3 ]

29 голосов
/ 18 февраля 2011

Property Set для объектов (например, экземпляров классов)

Property Let для "обычных" типов данных (например, string, boolean, long и т. Д.)

24 голосов
/ 19 февраля 2011

Property Let более универсален, чем Property Set.Последний ограничен только ссылками на объекты.Если у вас есть это свойство в классе

Private m_oPicture          As StdPicture

Property Get Picture() As StdPicture
    Set Picture = m_oPicture
End Property

Property Set Picture(oValue As StdPicture)
    Set m_oPicture = oValue
End Property

Property Let Picture(oValue As StdPicture)
    Set m_oPicture = oValue
End Property

Вы можете позвонить Property Set Picture с

Set oObj.Picture = Me.Picture

Вы можете позвонить Property Let Picture с обоими

Let oObj.Picture = Me.Picture
oObj.Picture = Me.Picture

Реализация Property Set - это то, что другие разработчики ожидают от свойств, которые являются ссылками на объекты, но иногда даже Microsoft предоставляет только Property Let для ссылочных свойств, что приводит к необычному синтаксису oObj.Object = MyObject без оператора Set.В этом случае использование оператора Set приводит к ошибке времени компиляции или выполнения, поскольку в классе oObj не реализовано Property Set Object.

Я склонен реализовывать как Property Set, так и Property Letдля свойств стандартных типов - шрифтов, изображений и т. д. - но с другой семантикой.Обычно на Property Let я обычно выполняю «глубокое копирование», то есть клонирование StdFont вместо того, чтобы просто удерживать ссылку на исходный объект.

4 голосов
/ 18 февраля 2011

Property Set для переменных типа объекта (ByRef), тогда как Property Let для переменных типа значения (ByVal)

...