我一直在使用课程一段时间,但我觉得我可能错误地使用了它们。
当我为类创建属性时,我只使用公共变量,所以最终得到如下内容:
Class clsMyClass
Public Name As String
End Class
但是,我一直在网上阅读一些信息,他们建议应该按照以下方式设置:
Class clsMyClass
Private Name As String
Property UsersName() As String
Get
Return Name
End Get
Set(ByVal Value As String)
Name = Value
End Set
End Property
End Class
我这样做的方式是不是非常错误?如果是这样,为什么?我觉得第二种方法增加了一些安全性,但说实话,它看起来像不必要的代码..?
答案 0 :(得分:3)
属性的一个优点是,它们允许您自定义对私有字段的访问权限,并使您能够执行更多操作,以便您可以执行以下操作(示例,它不仅限于此):
答案 1 :(得分:1)
请参阅下面C#深度article中属性优于变量的优点:
•具有属性的更精细的访问控制。需要它是公开可获得的,但实际上只希望它设置为受保护的访问?没问题(从C#2开始,至少)。
•只要值发生变化,想要进入调试器吗?只需在setter中添加断点即可。
•想要记录所有访问权限吗?只需将日志记录添加到getter即可。
•属性用于数据绑定;字段不是。
其他几点: 1)您也可以将属性设置为只读,这样没有来自类外的人设置值但可以获取它。 2)您可以在get和set中执行某些操作。即在任何时候附加一个前缀添加前缀 3)您还可以使用自动实现的属性来最小化以下代码:
Public Property Name As String
答案 2 :(得分:0)
你没有做错任何事。属性基本上给你一个简写,一个语法糖。
如果必须在使用属性时,仍然可以使用支持私有变量并在get和set中执行逻辑。更好的是私有/受保护的集合或获取,这又是另一种语法糖,因此您不必手动编写所有代码。
答案 3 :(得分:0)
首先,VB.NET允许您使用这种语法(称为速记属性声明 - 我相信自VS 2010以来):
Public Property Name As String
与此不同(称为字段声明):
Public Name As String
其次,Microsoft数据绑定对字段不起作用。试试这个例子(见下文)。
示例。在空的WinForms项目的空表单上放置一个名为ListBox1
的列表框(默认名称)和一个名为Button1
的按钮。用以下内容替换您的表单代码:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim lst As New List(Of clsMyClass)
lst.Add(New clsMyClass)
ListBox1.ValueMember = "Name"
ListBox1.DisplayMember = "Name"
ListBox1.DataSource = lst
End Sub
End Class
Class clsMyClass
Public Property Name As String = "Hello"
End Class
启动应用程序并注意列表框中填充了一个条目Hello
。这证明绑定工作正常。现在用字段声明替换你的属性声明。再次启动您的应用程序并注意列表框显示您的类类型转换为String。这意味着您的字段绑定不起作用,而是使用默认绑定,其中DisplayMember
被分配为classInstance.ToString()
。
如果您想了解更多有关幕后情况的信息,可以在.DataSource
作业中设置断点,并查看DisplayMember
如何重置或保留其值,具体取决于您是否使用字段或属性。