首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在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

回答 2

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

Stack Overflow用户

发布于 2021-02-25 03:20:30

动态计算的值

我没有阅读这些链接,但您可能希望实现自己的getter和setter的一个原因是,您可能希望返回一些需要某种类型的计算或操作的内容。例如,假设您有一项Sale具有属性RawPriceSalesTax,以及FinalPrice。但是,您需要/选择每次动态计算最终价格(基于可变销售税)。所以首先设置RawPrice,然后查询FinalPrice,它返回RawPrice + SalesTax,但是SalesTax是根据其他一些属性动态计算的,比如原产国等。

数据的另一种视图

您可能希望这样做的另一个原因是提供相同核心数据的另一个视图。例如,如果您的数据是一个HTML页面,也许一个属性返回正常的字符串值,而另一个属性返回"no-HTML“属性有一个自定义的Getter,它执行一些正则表达式来删除所有HTML标记并返回纯文本变体。这允许您将所有相关代码放在一个子程序集中,而不是让您的主程序进行各种操作。

代码可移植性

由于代码的可移植性,这可以使您的工作变得轻松许多。您的代码现在在其他项目中更容易重用,因为您只需要一个程序集。

私有变量与属性

如果我正在做一些调用具有这样属性的类的事情,那么它很可能也会有方法。这些方法几乎总是需要创建私有变量,而程序集之外的任何人都不需要知道这些变量。然而,在这种情况下,它们不会是私有属性,而是简单的私有变量。例如,不是Private Property Name() As String,由于其隐含的带有getters和setter的自动实现的backer变量,我只想说Private Name() As String,这相当于Dim Name() As String。您可以像往常一样在类中使用变量、常量等,并且在默认情况下,其他人不会知道任何关于它们的信息。

我不明白你为什么要用私人财产。也许有一个很好的理由;我只是不知道它是什么。大多数情况下,私有变量可能才是您真正想要的。如果您认为确实需要一个私有属性是有原因的,我很想听听您的想法。(我总是乐于接受一种新的思维方式!)

历史

多年来,Visual Basic .NET中不存在自动实现的属性。在过去,您别无选择,只能使用GET/SET。因此,对于VB.NET来说,能够像您在第一个代码示例中那样简单地声明属性,并让运行时自动生成backer变量,这是一个较新的发展。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66356592

复制
相关文章

相似问题

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