【发布时间】:2021-05-27 02:37:07
【问题描述】:
我对在 VB.net 中使用 GET 和 SET 方法的需要感到有些困惑。我想在这方面讨论两种情况:第一种是将属性声明为 PUBLIC 时,然后将属性声明为 PRIVATE 时。
我发现当我将一个属性定义为公共时,我可以直接设置和访问该属性的值,而无需使用 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
当我将相同的属性声明为私有时,如下所示,我仍然可以通过简单地使用构造函数和公共子例程来设置和访问私有属性的值。见下文:
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 方法……但是您能帮我理解我们必须显式使用 GET/SET 方法的情况吗?还是使用 GET/SET 是一种选择?如果使用 GET/SET,验证是可以在稍后阶段轻松添加的一件事,但那是唯一的原因吗? PL 给出你的意见。
此外,我在 stackoverflow 中遇到了以下两个相关问题(尽管针对不同的语言):链接如下:
Why to use getter and setter methods to set class properties?
Why use getters and setters/accessors?
但我无法理解证明使用 GET/SET 方法的大部分原因。例如,如果我们不使用 GET/SET 方法,那么我们会将属性暴露给外部世界——这意味着它可以从类外部直接访问。但这仅适用于 PUBLIC 属性,因为不能从类外部直接访问 PRIVATE 属性。同样,在第二个链接中,作者提到以下作为使用 GET/SET 的原因:为运行时属性更改时提供调试拦截点 - 调试属性更改为特定值的时间和地点可以在某些语言中如果没有这个就很难了。这到底是什么意思——任何简单的现实生活例子?
【问题讨论】:
-
请注意,即使在您没有看到
Get和Set例程的情况下,它们仍然存在——VB 只是自动生成它们。如果您愿意,您甚至可以分配给代码中的支持字段。在您的示例中,有一个名为_Name的隐式定义字段。隐式定义的Get例程从该字段中检索其值,隐式定义的Set例程将新值分配给该字段。 -
至于你的粗体:当你有明确的
Get和Set例程时,你可以在例程中设置一个调试器断点,然后如果你在调试器中运行,每次你的代码进入例行程序,就会中断。通常,您会想要这样做,因为您不了解它何时/如何发生。使用您的代码,想象稍后某个时间,您检查Name,并找到“Siegfried”。你以为它是“罗伊”。您可以在Set例程中设置断点,以便了解它是如何更改的。
标签: vb.net