【问题标题】:VB.Net Public PropertyVB.Net 公共财产
【发布时间】:2020-12-17 09:03:13
【问题描述】:

在我的程序上使用代码分析我经常收到这个警告:

CA1051:Microsoft.Design:由于字段“Form1.Testcode”在其声明类型之外可见,因此将其可访问性更改为私有并添加一个与该字段当前具有相同可访问性的属性,以提供对其的访问。

所以它告诉我要么更改以下代码:Public Testcode As String 对此:Public Property Testcode As String

或者到这个:

Private _testcode
 Public Property Testcode As Object
        Get
            Return _testcode
        End Get
        Set(value As Object)
            _testcode = value
        End Set
    End Property

所以我的问题是,这两个代码建议有什么区别。 一个比另一个快还是它可以防止错误或其他任何东西?从那时起我就一直在使用第一个代码,并且从来没有遇到过任何问题,也没有感觉滞后或其他问题。

说我希望我的程序尽可能快,我应该将我拥有的代码更改为属性代码,如果是,选择哪个?

【问题讨论】:

  • 它与速度/性能无关。 Fields 通常保留Private 到类,并使用 Properties` 访问。这允许在从类中检索数据时进行一定程度的抽象。理论上,您可以在返回值之前对属性进行验证,或者在不影响访问它的外部类的情况下更改字段实现。此外,您可以使用属性设置数据的访问级别,例如将其设为 ReadOnly

标签: vb.net properties private public


【解决方案1】:

属性的关键在于它们的行为从外部看像字段,但从内部看却像方法。事实上,一旦你的代码被编译,你的属性的 getter 和 setter 实际上就是方法。 Java 不支持属性,但即便如此,约定也是声明一个私有字段,然后声明两种获取和设置字段值的方法。

始终使用属性公开数据。如果没有别的,这意味着您可以绑定该类型的对象,因为属性支持数据绑定而字段不支持。如果您以后需要更改实现,这也大大降低了您需要更改类型接口的可能性。

至于如何实现属性,请始终使用自动属性,即单行选项,除非您需要添加额外代码来执行验证或引发事件等操作。如果你编写一个自动属性,私有字段仍然在幕后创建——你甚至可以在代码中访问它——编译器仍然创建 getter 和 setter 方法。简而言之,更喜欢这个:

Public Property Data As SomeType

到这里:

Private _data As SomeType

Public Property Data As SomeType
    Get
        Return _data
    End Get
    Set
        _data = value
    End Set
End Property

需要完整属性的情况示例如下:

Private _number As Integer

Property Number As Integer
    Get
        Return _number
    End Get
    Set
        'Validation
        If Value < 0 Then
            Throw New ArgumentOutOfRangeException("value", $"'Number' must not be less than zero.")
        End If

        If _number <> Value Then
            _number = Value

            'Change notification.
            OnNumberChanged(EventArgs.Empty)
        End If
    End Set
End Property

Public Event NumberChanged As EventHandler

Protected Overridable Sub OnNumberChanged(e As EventArgs)
    RaiseEvent NumberChanged(Me, e)
End Sub

【讨论】:

    【解决方案2】:

    Auto-Implemented Properties:

    当您为自动实现的属性编写代码时,Visual Basic 编译器自动创建一个私有字段来存储属性 除了创建关联的 Get 和 Set 之外的变量 程序。

    所以使用简写符号:

    Public Property Testcode As String
    

    当你编译时,结果与更长的详细属性相同的代码。

    最终没有区别。

    【讨论】:

      【解决方案3】:
      • 一个比另一个快吗? 没有。
      • 它是否可以防止错误或其他任何事情? 是的。

      在 VB 中,Public Testcode As StringPublic Property Testcode As String 看起来几乎相同。但是让我们把语法放在一边,我们在这里讨论的是成员变量属性

      • 成员变量是你必须在你的类中使用的变量,当它们必须“存活”时,只要类实例存在。它与所有其他变量基本相同,但没有定义上下文(例如方法的结尾)。您通常会使用它们来保持某种状态,例如用户是否已确认消息或类似的东西。如果此类信息对您的类的逻辑很重要,但对其他人不重要,那么您就是成员变量的完美候选者。

      • 属性在这里并没有太大的不同,并且在技术上可以相同地使用。但是它们是外部接口的一部分。如果您必须保存对您的班级和其他班级(使用您的班级)也很重要的信息,那么您就是一个完美的财产候选人。例如,这可能是按钮的边框颜色。当然,其他类可能会通过给定的设计设置颜色,并且按钮本身需要它来相应地呈现边框。公共方法和属性构建了其他方可以与之交互的接口。 StackOverflow 上有一些有用的答案,我会在下面链接它们而不是复制它们的内容。

      我们为什么要关心?

      所以我们基本上是在谈论封装和information hiding。但让我们看一个更实际的例子。

      看看您的台式电脑。把它转过来看看它暴露的所有连接器。这是机器的公共接口。这就是您作为机器消费者可以与之交互的内容。您会看到 USB 端口、HDMI 连接器等。您无需了解机器的内部结构即可了解可以将鼠标连接到何处或如何连接 HDMI 到 DisplayPort 适配器。事实上,如果您可以在 PC 的背面使用每个内部连接器,那将会非常混乱。它会增加太多不必要的混乱,也会使事情变得危险。因为您没有机会知道所有这些引脚和连接器的用途。硬件制造商不能依赖预期的条件,因为任何人都可能在不知情的情况下从外部搞砸了。

      您作为消费者可以与之交互的所有内容都通过标准连接器的接口公开。机器内部工作所需的一切都远离你,以避免混淆关于你不需要知道的事情并确保没有人弄乱机器的内部状态不得不依靠。

      所以你可以说“让所有事情都公开,因为我没有秘密”,但实际上这会让课程变得非常很难从外面理解。通过设置来自您的类在内部处理且必须依赖的外部代码的成员,它可以在不知不觉中轻松破坏事情。

      我们作为软件开发人员必须牢记的另一个方面:可维护性。如果你有很多公共成员,那么在进行重构时你就会被锁定,因为你永远不会知道那里的任何人是如何使用它们的。保持与外部的干净界面对于以后能够在内部进行更改非常重要。

      见:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-13
        • 2011-12-21
        • 2016-02-13
        • 2018-05-18
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多