问题描述
在我的程序上使用代码分析通常会收到以下警告:
CA1051:Microsoft.Design:因为字段“ Form1.Testcode”在其声明类型之外可见,所以将其可访问性更改为private并添加一个属性,该属性与该字段当前具有相同的可访问性,以提供对其的访问。
所以它告诉我可以更改以下代码: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
所以我的问题是,这两个代码建议之间有什么区别? 一个比另一个快吗?它可以防止错误或其他问题吗?从那以后,我一直在使用第一个代码,从来没有遇到过滞后或其他问题。
说我希望我的程序尽快运行,我应该将必须具有的代码更改为“属性”代码,如果可以,应该选择哪个?
解决方法
属性的要点是它们的行为类似于外部的字段,而类似于内部的方法。实际上,一旦编译了代码,属性的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
,
- 一个比另一个快吗? 否。
- 它是否可以防止错误或其他? 是
在VB中,Public Testcode As String
和Public Property Testcode As String
看起来几乎一样。但让我们放下语法,我们在这里谈论成员变量和属性。
-
成员变量是您必须在类中使用的变量,只要它们必须“存活”(只要类实例需要)即可。它基本上与所有其他变量相同,但是没有定义的上下文(例如,方法的结尾)。您通常会使用它们来保持某种状态,例如用户是否确认了一条消息或类似的消息。如果这类信息对您班级的逻辑很重要,而对其他人而言则不重要,那么您很适合选择成员变量。
-
属性在这里差别不大,并且在技术上可以相同地使用。但是,它们是外部接口的一部分。如果您还必须保存对您的班级和其他班级也很重要的信息(使用您的班级),则您是该属性的理想人选。例如,这可以是按钮的边框颜色。其他类可能会通过给定的设计来设置颜色,并且按钮本身当然需要它来相应地渲染边框。公共方法和属性构建了其他各方可以交互的界面。在StackOverflow上有一些有用的答案,我将在下面链接它们,而不是复制其内容。
我们为什么要在意呢?
因此,我们基本上是在谈论封装和information hiding。但是,让我们在一个更实际的示例中对其进行研究。
查看台式机。转过来看看它暴露的所有连接器。这是机器的公共接口。这就是您作为机器使用者可以与之交互的内容。您会看到USB端口,HDMI连接器等。您无需了解机器的内部结构,就可以了解将鼠标连接到何处或如何将HDMI到DisplayPort适配器连接。实际上,如果在PC背面可以使用每个内部连接器,那将非常令人困惑。这会增加很多不必要的混乱,也会使事情变得危险。因为您没有机会知道所有这些引脚和连接器的用途。硬件制造商不能依靠预期的条件,因为有人可能在不知不觉中从外面弄乱了事情。
您作为消费者可以与之交互的所有东西都通过标准连接器的接口公开。机器内部需要工作的所有内容都远离您,从而避免造成不必要的混乱,并确保没有人弄乱机器的内部状态必须依靠。
所以您可以说“让所有事情都公开,因为我没有秘密”,但实际上这会使全班从外面很难理解。通过从类内部处理并必须依赖的外部代码中设置成员,可以很容易地在不知不觉中破坏。
我们作为软件开发人员必须记住的另一方面:可维护性。如果您有很多公共成员,那么在进行重构时您会被锁定,因为您永远不知道那里的任何人如何使用它们。保持与外界的干净接口对于以后稍后在内部进行更改很重要。
请参阅:
- Internal applications - why not make everything public?
- Why shouldn't I be using public variables in my Java class?
请参见Auto-Implemented Properties:
当您为自动实现的属性编写代码时,Visual Basic 编译器自动创建一个私有字段来存储属性 除了创建关联的Get和Set变量 程序。
因此使用速记符号:
Public Property Testcode As String
与编译时的冗长冗长属性使用相同的代码。
最后没有区别。