在 VB6 中,Property Set 和 Property Let 有啥区别?
Posted
技术标签:
【中文标题】在 VB6 中,Property Set 和 Property Let 有啥区别?【英文标题】:In VB6 what is the difference between Property Set and Property Let?在 VB6 中,Property Set 和 Property Let 有什么区别? 【发布时间】:2011-06-29 20:49:01 【问题描述】:我刚刚创建了几个Property Set
方法,但它们没有编译。当我将它们更改为Property Let
时,一切都很好。
此后我研究了文档以找出Property Set
和Property Let
之间的区别,但我必须承认自己并不聪明。有什么区别吗,如果有的话,有人可以提供一个正确解释的指针吗?
【问题讨论】:
【参考方案1】:Property Set
用于对象(例如,类实例)
Property Let
用于“普通”数据类型(例如,字符串、布尔值、长整数等)
【讨论】:
它与WithEvents无关,它用于将对象引用作为属性返回。有很多时候你想这样做,最常见的是当你有任何类型的对象层次结构时。 错了。Property Get
用于将对象引用作为属性返回,而不是 Property Set
。
msdn.microsoft.com/en-us/library/aa266202(VS.60).aspx:与Function
和Property Get
过程一样,Property Set
过程是一个单独的过程,它可以接受参数、执行一系列语句并更改其参数的值. 但是,与Function
和Property Get
过程不同,它们都返回一个值,您只能在对象引用赋值的左侧使用Property Set
过程(Set
语句)。
+1 更正Property Set
定义了一个可以在Set
语句的左侧使用的属性。我确实认为提到WithEvents
有点令人困惑,但它与解释差异并没有真正的关系。 Property Set
可用于可在运行时动态更改的对象之间的 1:1 关系,即超出 WithEvents
。
是的,对于“设置”一个属性 - 我有这个 180 度向后,mea culpa。最后,就像阅读上面指出的手册一样简单。【参考方案2】:
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
而不仅仅是持有对原始对象的引用。
【讨论】:
假设您同时拥有Property Set
和 Property Let
作为对象类型,并假设实现代码相同(如您的示例中),VB6 是否有任何内置差异当开发人员调用任一属性时,实际上会这样做吗?例如,如果开发人员调用Let
属性,VB6 是否会隐式决定突然按值而不是按引用传递对象,还是有任何其他类似的细微差别? (我知道你说你喜欢写的那些有不同的语义,但我不确定语言本身是否有什么不同。)
在 VB6 中,参数没有“按值传递对象”选项。使用 ByVal oValue As StdPicture
与 ByRef oValue As StdPicture
会改变对象 reference 的传递方式。就像 C/C++ 中的 StdPicture *oValue
与 StdPicture **oValue
一样——总是指针,但在第二种情况下,可以在过程中更改 reference (例如,将 ref 分配给新对象)和调用者可以收到这个新的引用。所以本身没有“复制”选项,我通常在Property Let
内部使用Clone
方法(例如在IFont
接口上)来手动实现“深度复制”语义。
对于引用类型,我的意思是按值传递引用,就像在 VB.NET/C# 中一样。
自从看了@wqw的最后两段作为我个人的编码规则,需要深拷贝Collection和Class实例;一看就知道是指针还是克隆太方便了...【参考方案3】:
Property Set
用于类对象变量 (ByRef) 而Property Let
用于类值变量 (ByVal)
【讨论】:
这不是 ByRef 与 ByVal 的问题,而是严格用于将对象引用返回给调用者。 确实不是 ByRef/ByVal 问题。但它不用于将对象引用返回给调用者。为此,您使用Property Get
与返回任何其他类属性相同(没有返回类属性的对象特定版本)。
是的,我完全倒过来了,它是为了分配给一个对象属性 - 呃,那里真的很糟糕。以上是关于在 VB6 中,Property Set 和 Property Let 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Python get 和 set 方法与 @property 装饰器
Python中的property类和@property装饰器
CMake中set_property/get_property的使用
prctl(PR_SET_NAME PR_SET_NAME)和pthread_setname_np()之间的区别是什么?