いくつかのProperty Set
メソッドを作成しましたが、コンパイルされませんでした。それらをProperty Let
に変更したとき、すべてが順調でした。
それ以来、ドキュメントを調べてProperty Set
とProperty Let
の違いを見つけましたが、賢明ではないことを認めなければなりません。違いはありますか?もしそうなら、誰かがそれの適切な説明へのポインターを提供できますか?
Property Set
は、オブジェクト(クラスインスタンスなど)用です
Property Let
は、「通常の」データ型(例えば、string、boolean、longなど)用です。
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
のみを提供する場合もあり、Set
ステートメントなしの異常な構文oObj.Object = MyObject
につながります。この場合、Set
クラスにProperty Set Object
が実装されていないため、oObj
ステートメントを使用するとコンパイル時または実行時エラーが発生します。
私は、標準タイプ(フォント、画像など)のプロパティにProperty Set
とProperty Let
の両方を実装する傾向がありますが、セマンティクスは異なります。通常Property Let
で「ディープコピー」を実行する傾向があります。つまり、元のオブジェクトへの参照を保持する代わりにStdFont
を複製します。
Property Set
はオブジェクトに似た変数(ByRef)用で、Property Let
は、値のような変数用です(ByVal)