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

Sou*_*ata 0 vb.net

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么我们需要使用 GET/SET 方法?我知道每当对属性进行赋值时,都会隐式调用 SET 方法...但是您能否帮助我理解我们必须显式使用 GET/SET 方法的情况?或者说使用 GET/SET 是更多的选择?如果使用 GET/SET,验证是可以在稍后阶段轻松添加的一件事,但这是唯一的原因吗?PL们发表一下你们的看法。

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

为什么要使用 getter 和 setter 方法来设置类属性?

为什么要使用 getter 和 setter/accessors?

但我无法理解使用 GET/SET 方法的大部分理由。例如,如果我们不使用 GET/SET 方法,那么我们就会将该属性暴露给外界 - 这意味着它可以从类外部直接访问。但这只适用于 PUBLIC 属性,因为不能从类外部直接访问 PRIVATE 属性。同样,在第二个链接中,作者提到以下作为使用 GET/SET 的原因:为运行时属性更改时提供调试拦截点 - 如果没有此功能,调试属性何时何地更改为特定值可能会非常困难一些语言。这到底是什么意思——有什么简单的现实生活例子吗?

Oli*_*bes 5

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

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

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

您可以通过声明字段并显式编写 getter 和 setter 来声明这样的属性。

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
Run Code Online (Sandbox Code Playgroud)

或使用自动实现的属性

Public Property Prop1 As String
Run Code Online (Sandbox Code Playgroud)

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

当您仅在声明该属性的类中使用该属性时,将其声明为私有属性是有意义的。这仍然提供您提供的链接中描述的优点,因为此属性仍然隐藏访问字段、进行验证等的详细信息;但是,它并不禁止直接访问类内的支持字段。因此,您需要对私有财产更加严格。


属性对于调试意味着什么?您可以轻松地在 getter 或 setter 内设置断点来检测对属性的访问。您不能在字段上设置断点,因为字段永远不会执行。这只是一个声明。

您还可以添加System.Diagnostics.Debug.Writeline("=====> test")(写入“输出”窗口)或在 getter 和 setter 中进行一些日志记录。

另请参阅:教程:学习使用 Visual Studio 调试 Visual Basic 代码


使用Windows 窗体数据绑定WPF 数据绑定属性时是必需的。他们还允许更改通知