在 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 SetProperty Let 之间的区别,但我必须承认自己并不聪明。有什么区别吗,如果有的话,有人可以提供一个正确解释的指针吗?

【问题讨论】:

【参考方案1】:

Property Set 用于对象(例如,类实例)

Property Let 用于“普通”数据类型(例如,字符串、布尔值、长整数等)

【讨论】:

它与WithEvents无关,它用于将对象引用作为属性返回。有很多时候你想这样做,最常见的是当你有任何类型的对象层次结构时。 错了。 Property Get 用于将对象引用作为属性返回,而不是 Property Set msdn.microsoft.com/en-us/library/aa266202(VS.60).aspx:与FunctionProperty Get 过程一样,Property Set 过程是一个单独的过程,它可以接受参数、执行一系列语句并更改其参数的值. 但是,与FunctionProperty Get 过程不同,它们都返回一个值,您只能在对象引用赋值的左侧使用Property Set 过程(Set 语句)。 +1 更正Property Set 定义了一个可以在Set 语句的左侧使用的属性。我确实认为提到WithEvents 有点令人困惑,但它与解释差异并没有真正的关系。 Property Set 可用于可在运行时动态更改的对象之间的 1:1 关系,即超出 WithEvents 是的,对于“设置”一个属性 - 我有这个 180 度向后,mea culpa。最后,就像阅读上面指出的手册一样简单。【参考方案2】:

Property LetProperty 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 SetProperty Let,但语义不同。通常在Property Let 上,我倾向于执行“深拷贝”,即克隆StdFont 而不仅仅是持有对原始对象的引用。

【讨论】:

假设您同时拥有 Property SetProperty Let 作为对象类型,并假设实现代码相同(如您的示例中),VB6 是否有任何内置差异当开发人员调用任一属性时,实际上会这样做吗?例如,如果开发人员调用Let 属性,VB6 是否会隐式决定突然按值而不是按引用传递对象,还是有任何其他类似的细微差别? (我知道你说你喜欢写的那些有不同的语义,但我不确定语言本身是否有什么不同。) 在 VB6 中,参数没有“按值传递对象”选项。使用 ByVal oValue As StdPictureByRef oValue As StdPicture 会改变对象 reference 的传递方式。就像 C/C++ 中的 StdPicture *oValueStdPicture **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 装饰器

EF软删和删除 运用泛型

Python中的property类和@property装饰器

CMake中set_property/get_property的使用

prctl(PR_SET_NAME PR_SET_NAME)和pthread_setname_np()之间的区别是什么?

Nexys4 DDR MIG控制器引脚文件