编程VB.NET 开发者,企业应用程序开发者

解释完全 Get/Set 块属性和自动实现属性之间的区别,并讲述在使用 Set 中 Value 的相关细节。

用 Hintsage AI 助手通过面试

答案。

在 Visual Basic 中,属性(Property)可以通过两种方式声明:

  • 完全属性(带有自己的 Get/Set 块): 允许控制对数据的访问,在读取/写入值时执行额外的检查或操作。
  • 自动属性(auto-implemented): 简化的语法,不明确编写 Get/Set,而是自动创建一个私有字段:
' 自动属性 Public Property Name As String ' 完全属性 Private _age As Integer Public Property Age As Integer Get Return _age End Get Set(value As Integer) If value < 0 Then Throw New ArgumentException("年龄不能为负") _age = value End Set End Property

使用 Set 的细节:

  • 关键字 Value 是一个伪变量,引用被赋值的值。
  • Set 内可以执行验证、记录、触发事件。
  • 在自动实现的情况下,无法控制匿名字段的修改。

何时使用:

  • 自动属性 — 当需要最简单的 "容器" 时。
  • 完全属性 — 当设置/获取时需要逻辑(验证、通知、计算)。

具有挑战性的问题。

在 VB.NET 中将 Set(ByVal value As Integer) 写成 Set(value As Integer) 有何后果?为什么不应该这样写?

回答: VB.NET 的语法不需要(也不支持)在 Set 中明确声明参数 ByVal — 只需使用 Set(value As Type)。如果写成 Set(ByVal value As Integer),将导致编译错误。

错误代码示例:

'Set(ByVal value As Integer) — 编译错误 Public Property Prop As Integer Set(ByVal value As Integer) ... End Set End Property

在经典的 VB6 中,这种语法是允许的,但在 VB.NET 中严格要求 Set(value As Type)


历史

在一个大型项目中,从 VB6 自动迁移到 VB.NET 的代码时,在 Set 中添加了 ByVal — 编译器产生了神秘的错误,开发人员长期无法定位,因为 lint 工具没有明确指出原因。

历史

在一个处理大数据集的项目中,使用自动属性存储数据,然后出现问题:需要跟踪属性是否被更改,以便自动记录每次更改。结果不得不将自动属性改为完全属性 — 最终在重构中浪费了大量时间,因为最初没有考虑到 Set 中可能需要额外的逻辑。

历史

在通过自动属性复制引用类型的对象时,忘记通过 Get/Set 实现深拷贝。结果会导致对同一对象的引用重复;一个实例的更改会导致另一个实例的更改。