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 String
和Public 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 成员,那么在进行重构时您会非常受限,因为您永远不知道外面的人是如何使用它们的。保持与外部的干净接口对于以后能够在内部进行更改非常重要。
参见:
- Internal applications - why not make everything public?
- Why shouldn't I be using public variables in my Java class?
在我的程序中使用代码分析时,我经常收到此警告:
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 String
和Public 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 成员,那么在进行重构时您会非常受限,因为您永远不知道外面的人是如何使用它们的。保持与外部的干净接口对于以后能够在内部进行更改非常重要。
参见:
- Internal applications - why not make everything public?
- Why shouldn't I be using public variables in my Java class?