VB.Net Public 属性

VB.Net Public Property

在我的程序中使用代码分析时,我经常收到此警告:

CA1051 : Microsoft.Design : Because field 'Form1.Testcode' is visible outside of its declaring type, change its accessibility to private and add a property, with the same accessibility as the field has currently, to provide access to it.

所以它告诉我要么更改代码: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

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

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

属性的要点在于它们在外部表现得像字段,但在内部表现得像方法。事实上,一旦你的代码被编译,你的 属性 的 getter 和 setter 实际上是方法。 Java 不支持属性,但即使在那里,约定也是将字段声明为私有,然后声明两种获取和设置字段值的方法。

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

至于如何实现 属性,请始终使用 auto-property,即 one-line 选项,除非您需要添加额外的代码来执行诸如验证或引发事件。如果您编写 auto-property,私有字段仍会在后台创建 - 您甚至可以在代码中访问它 - 编译器仍会创建 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

参见Auto-Implemented Properties

When you write code for an auto-implemented property, the Visual Basic compiler automatically creates a private field to store the property variable in addition to creating the associated Get and Set procedures.

所以使用 shorthand 表示法:

Public Property Testcode As String

在您编译时生成与较长的冗长 属性 相同的代码。

最后没有区别

  • Is one faster than the other? No.
  • Does it prevent bugs or anything else? Yep.

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

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

  • Properties 在这里差别不大,技术上可以相同使用。然而,它们是 外部接口 的一部分。如果您必须掌握对您的 class 和其他 class 也很重要的信息(使用您的 class),那么您是 属性 的完美人选。例如,这可能是按钮的边框颜色。当然,其他 classes 可能会根据给定的设计设置颜色,并且按钮本身需要它相应地呈现边框。 Public 方法和属性构建了其他方可以与之交互的界面。 Whosebug 上有一些有用的答案,我将在下面 link 它们而不是复制它们的内容。

我们为什么要关心?

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

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

作为消费者,您可以与之交互的一切都是 public 标准连接器的接口。机器内部工作所需的一切都远离你,以避免混淆你不需要知道的事情,确保没有人扰乱内部状态机器还得靠

所以你可以说“让我们做所有事情 public 因为我没有秘密”但事实上这会使 class 非常 难以理解 从外部。通过从您的 class 内部处理并且必须依赖的外部代码设置成员,这将使 容易在不知不觉中破坏 事情。

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

参见: