.net 类属性实现样式
我正在努力学习更多关于编程的知识,特别是面向对象的编程 我有一本书解释了如何创建属性,但他们也将其与私有变量相结合。我不明白他们为什么这样做,以及这样做的好处是什么 下面是一个示例代码.net 类属性实现样式,.net,vb.net,class,properties,.net,Vb.net,Class,Properties,我正在努力学习更多关于编程的知识,特别是面向对象的编程 我有一本书解释了如何创建属性,但他们也将其与私有变量相结合。我不明白他们为什么这样做,以及这样做的好处是什么 下面是一个示例代码 Namespace PropertyExample Class Person Private _Name As String Public Property Name() As String Get
Namespace PropertyExample
Class Person
Private _Name As String
Public Property Name() As String
Get ' (1)
Name = _Name
End Get
Set(ByVal value As String) ' (2)
_Name = value
End Set
End Property
End Class
我还举了另一个例子,他们是这样写的,这是我的观点
Class Person
Public Property Name() As String
End Class
我认为哪个更干净
后者称为自动实现的属性。编译器提供可以减少锅炉板代码的支持字段。您仍然可以在代码中引用\u Name
私人成员
更好/更干净取决于。对于以下情况,您需要完整版本:
Public ReadOnly Property Age As Integer
Get
If DateOfBirth <> DateTime.MinValue Then
Return (DateTime.Now.Year - DateOfBirth.Year)
Else
Return 0
End If
End Get
End Property
有时无法使用自动机具版本。作为一本书,我希望它能涵盖/展示这两种方式,至少对那些拥有较旧版本VS的人来说是如此
自动实现的属性在VS 2010中可用;NET Framework版本并不重要,因为它是一个编译器功能。使用
私有变量的原因是只能在此类中访问。
当您仔细观察时,您将看到属性
被调用名称
和变量
被调用\u名称
。这是一种命名约定,您应该使用它。该变量
即使是从同一个类中,也不应该从该属性
以外的任何对象访问
也就是说,属性
是公共的
,可以从不同的类
和项目
访问
您展示了酒店的常见外观:
Private _Name As String
Public Property Name() As String
Get ' (1)
Name = _Name
End Get
Set(ByVal value As String) ' (2)
_Name = value
End Set
End Property
Set(ByVal value As String)
If value.Length <= 50
_Name = value
Else
'Throw some validation error
End if
End Set
其他包括只读、写式:
Private _Name As String
Public ReadOnly Property Name() As String
Get ' (1)
Name = _Name
End Get
End Property
另一个好例子是:
Private _Name As String
Public ReadOnly Property Name() As String
Get ' (1)
If Strinf.IsnullOrEmpty(_Name)
_Name = Somemethod()
End if
Return _Name
End Get
End Property
此属性在第一次使用时初始化
您提到的第一种方法是在.NET3.5之前编写属性的唯一方法
第二个被称为C#3.0/.NET3.5,并由C#3.0/.NET3.5引入
在内部,自动实现的属性也使用私有变量来存储数据。这只是编译器添加的语法糖,可以节省开发人员一点时间并使代码更具可读性
为什么要使用可见的声明变量,而不是仅使用自动实现的属性?
嗯,这取决于你的程序的上下文。如果您只需要名称变量的1:1公共映射器,可以使用自动实现
但是,如果在设置/获取您拥有的变量值时需要一些逻辑,则使用额外变量方法
假设您得到了应用程序中的名称不得超过50个字符的要求。您可以在属性的setter中处理此验证:
Private _Name As String
Public Property Name() As String
Get ' (1)
Name = _Name
End Get
Set(ByVal value As String) ' (2)
_Name = value
End Set
End Property
Set(ByVal value As String)
If value.Length <= 50
_Name = value
Else
'Throw some validation error
End if
End Set
vs
正如您所看到的,这两个代码段都在变量\u Name
(stfld)中读取/写入其字符串值。
(唯一不同的是调试时使用的nop
命令,在这里可以忽略。)据我所知,最后一个示例是自动实现的属性。它们还没有推出(可能是5年前)。也许这本书在出版之前就已经出版了?或者,在后面的章节中,作者将介绍自动实现的属性,与本书前面的示例比较并展示更好的语法。最后一个示例使编译器为您生成一个私有变量。使用私有变量的原因是,当您想要在获取/设置时执行计算/操作,或者当您拥有ReadOnly
属性时。Re:关于Get
语法的问题-这在VB中是有效的语法-设置过程名称“variable”的值,然后在函数退出时返回。您完全正确。我只是在过去的一年里没有使用vb,忘记了那个“特性”。我把那部分从我的答案中删除了。
Person.get_Name:
IL_0000: ldarg.0
IL_0001: ldfld UserQuery+Person._Name
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000A: ret
Person.set_Name:
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld UserQuery+Person._Name
IL_0007: nop
IL_0008: ret