首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在VB.Net中定义属性时要使用GET & SET方法?

为什么在VB.Net中定义属性时要使用GET & SET方法?
EN

Stack Overflow用户
提问于 2021-02-25 02:15:06
回答 2查看 120关注 0票数 0

我对在VB.net中使用GET & SET方法的必要性感到有点困惑。我想在这方面讨论两种情况:首先,当我们将属性声明为PUBLIC时;其次,当我们将属性声明为PRIVATE时。

我发现,当我将一个属性定义为public时,我可以直接设置和访问该属性的值,而无需使用GET/SET方法-非常简单:见下文

代码语言:javascript
复制
Module Program
    Sub Main()
        Dim t As New test()
        t.name = "Roy" 'Label 1
        Console.WriteLine("t.name = {0}", t.name)
        Console.ReadLine()
    End Sub
End Module

Class test
    Public Property name() As String
End Class

如下所示,当我将相同的属性声明为private时,我仍然可以通过简单地使用构造函数和公有子例程来设置和访问private属性的值。如下所示:

代码语言:javascript
复制
Module Program
    Sub Main()
        Dim t As New test()
        t.printValue()
        Console.ReadLine()
    End Sub
End Module

Class test    
    Private Property Name() As String 
    Sub New()
        Name = "Roy" 'Label 2
    End Sub

    Public Sub printValue()
        Console.WriteLine("Value stored in NAME is: {0}", Name)
    End Sub
End Class

所以我的问题是,为什么我们需要使用GET/SET方法呢?我知道,当一个属性发生赋值时,SET方法是隐式的called...but,你能帮助我理解我们必须显式使用GET/SET方法的情况吗?或者,使用GET/SET更多的是一种选择?如果使用GET/SET,验证是可以在稍后阶段轻松添加的一件事,但这是唯一的原因吗?请给出你的观点。

另外,我在stackoverflow中遇到了以下两个相关的问题(虽然针对不同的语言):链接如下:

Why to use getter and setter methods to set class properties?

Why use getters and setters/accessors?

但我无法理解使用GET/SET方法的大部分理由。例如,如果我们不使用GET/SET方法,那么我们就向外部世界公开了这个属性--这意味着它可以从类的外部直接访问。但这只适用于公共属性,因为私有属性不能从类外部直接访问。类似地,在第二个链接中,作者提到了以下内容作为使用GET/SET的原因:在某些语言中,如果没有这一点,当属性在运行时更改时提供调试拦截点-调试属性更改为特定值的时间和位置可能会非常困难。

这到底是什么意思-任何简单的现实生活中的例子?

EN

Stack Overflow用户

回答已采纳

发布于 2021-02-25 02:39:12

属性是字段的包装器,即类或结构变量。它提供了一个getter和/或setter方法来访问这个变量。(您还可以使用只读属性返回简单求值的结果,而不是绑定到单个字段。)

读取时隐式调用getter和setter,分别写入属性。

因此,问题不在于是否使用getter和setter,而在于是否直接或通过属性访问字段。

您可以像这样声明一个属性,方法是声明一个字段并显式地编写getter和setter。

代码语言:javascript
复制
Private _prop1 As String ' Backing field
Public Property Prop1() As String
    Get
        Return _prop1
    End Get
    Set(ByVal value As String)
        _prop1 = value
    End Set
End Property

或使用自动实现的属性

代码语言:javascript
复制
Public Property Prop1 As String

这两个声明是等效的。自动实现的属性隐式声明一个支持字段,并相应地实现getter和setter。

如果仅在声明属性的类中使用该属性,则将该属性声明为private是有意义的。这仍然提供了您提供的链接中描述的优点,因为此属性仍然隐藏了访问字段、执行验证等的细节;但是,它并不禁止直接访问类中的支持字段。因此,您需要更严格地处理私有属性。

——————————————————————————————————————

属性的含义是什么?调试什么?您可以很容易地在getter或setter中设置断点来检测对属性的访问。不能在字段上设置断点,因为字段从不执行。这只是一个声明。

您还可以添加一个System.Diagnostics.Debug.Writeline("=====> test")

(写入输出窗口),或者在getter和setter中做一些日志记录。

另请参阅:Tutorial: Learn to debug Visual Basic code using Visual Studio

当使用Windows Forms Data Binding or WPF Data Binding属性是必需的。它们还允许change notification.。

票数 4
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66356592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档