来自Getter的VB.NET Call Setter

Cam*_*m L 0 vb.net getter setter properties

我有一个这样的课:

Public Class MyClass

Private _intList As New List(Of Integer)
Private _avg As Decimal

Public Sub Add(ByVal anInt As Integer)
    _intList.Add(anInt)
End Sub

Public Property Avg() As Decimal
    Get
        Dim _sum As Integer = 0
        For Each anInt In _intList
            _sum += anInt
        Next
        Avg = If((_intList.Count > 0), _sum / _intList.Count, _avg)
        Return _avg
    End Get
    Set(ByVal value As Decimal)
        If _avg <> value Then
            _avg = value
            Console.WriteLine("Value changed")
        End If
    End Set
End Property

End Class
Run Code Online (Sandbox Code Playgroud)

Getter正在计算平均值并调用Setter来保存该值.由于某种原因,我无法理解,平均值始终为0.例如:

Dim c As New Class2()
c.Add(1)
c.Add(2)
c.Add(3)
Console.WriteLine(c.Avg.ToString()) ' This will print 0
Run Code Online (Sandbox Code Playgroud)

我做错什么了吗?这是什么原因?

Dan*_*Tao 6

哇,我想你已经发现了一个 VB奇怪的现象:当你是一个函数的定义里面,你可以返回一个值或者Return 通过使用=到"设置"功能的价值.

像这样:

Function GetInteger() As Integer
    GetInteger = 5
End Function
Run Code Online (Sandbox Code Playgroud)

在上面的函数中,该行GetInteger = 5基本上等于Return 5*.

好的,所以你可能已经知道了.但这是奇怪的部分,我不知道这是刚才测试它的情况(诚然,在Mono,但我看到你的行为相同):显然这也适用于属性吸气剂.所以看看这一行:

Avg = If((_intList.Count > 0), _sum / _intList.Count, _avg)
Run Code Online (Sandbox Code Playgroud)

你实际上并没有在那里打电话给那里的财产制定者 ; 你正在设置getter 的返回值.您可以通过删除该行来验证这一点Return _avg; 突然你会看到你的吸气剂开始返回实际的平均值.

*不完全相同,因为您可以稍后设置GetInteger其他东西而不立即返回,而使用Return确保函数立即返回.