Property在Visual Basic中用于封装对对象数据的访问,允许进行验证、计算和访问控制设置。属性包含Get块(用于读取值)和Set块(用于设置值)。
Private _age As Integer Public Property Age() As Integer Get Return _age End Get Set(ByVal value As Integer) If value < 0 Or value > 120 Then Throw New ArgumentException("年龄必须在0到120之间!") End If _age = value End Set End Property
通过这样的属性可以实现值的验证、缓存、实时计算等,对于用户而言,对象看起来像是一个普通字段。
Public Property ItemId As Integer ' 自动创建隐藏字段,无法访问逻辑
细微差别: 自动属性无法在不明确声明get/set的情况下扩展内部逻辑。
问题: 在Visual Basic中是否可以实现仅具有公共set和私有get的属性?如何为get和set设置不同的访问级别?
回答: 是的,从VB.NET开始,可以为get和set指定不同的访问级别:
Public Property Salary As Decimal Private Get Return _salary End Get Set(ByVal value As Decimal) _salary = value End Set End Property
在这个例子中,只有类可以获取Salary的值,外部对象只能设置它。
故事
开发人员对所有业务对象的字段使用了自动属性。后来,输入负值的验证变得必要,但将自动属性更改为显式属性需要手动修改大量代码,导致了错误和劳动成本。
故事
在从VB6迁移到VB.NET的过程中,部分属性被实现为具有public访问修饰符的字段:这打开了对类内部数据的完全未经授权的访问,导致外部对象对状态的不必要修改。
故事
在复杂对象中,属性的get块包含额外的计算,包括文件操作。当对属性频繁访问时,应用程序的性能急剧下降;结果发现,应该使用private字段来缓存结果,而不是在每次get时实时计算值。