Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 类属性实现样式_.net_Vb.net_Class_Properties - Fatal编程技术网

.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