Vb.net 为什么我的公共变量的行为不符合预期?

Vb.net 为什么我的公共变量的行为不符合预期?,vb.net,Vb.net,TxtRadius10中的值在应为5时一直返回0(TxtDiameter10框中的文本为10并已锁定)。我知道diameter正在初始化,因为如果我设置TxtRadius10.Text=diameter/2,它将返回5。这并不是您认为它在做的事情: Public Class Form1 Public diameter As Integer Public radius As Decimal = diameter / 2 Private Sub TxtRadius10_TextCha

TxtRadius10中的值在应为5时一直返回0(TxtDiameter10框中的文本为10并已锁定)。我知道diameter正在初始化,因为如果我设置TxtRadius10.Text=diameter/2,它将返回5。

这并不是您认为它在做的事情:

Public Class Form1

  Public diameter As Integer
  Public radius As Decimal = diameter / 2

  Private Sub TxtRadius10_TextChanged(sender As Object, e As EventArgs) Handles TxtRadius10.TextChanged, TxtDiameter10.TextChanged
    diameter = TxtDiameter10.Text
    TxtRadius10.Text = radius
  End Sub
End Class
radius
变量不包含对
diameter
变量的引用,以便将来进行计算。此赋值语句使用当前值计算一次,并将结果放置在
半径中。
直径的当前值为:

Public radius As Decimal = diameter / 2
嗯,这是未分配的。所以它默认为
0
。而
0/2
0
。因此,
radius
被初始化为
0
,并且在代码中不再分配它。所以它总是
0

如果要在每次访问时动态计算该值,请将其设置为属性:

Public diameter As Integer

现在,对
radius
的任何引用都将在每次访问时运行
Get
逻辑,并在运行中重新计算值。

您得到了一个意外循环

在TxtRadius10_TextChanged事件中更改TxtRadius10.Text的值时,它会再次触发该事件。由于直径从0开始(整数的默认值),因此半径值从0开始(0/2)


您还应该知道,在更新直径时,半径不会更新。您刚刚为它设置了一个初始值。当直径改变时,必须重新计算半径

您正在声明半径=直径/2 但是,当遇到此语句时,未定义直径


在定义半径之前先定义直径

帮个忙,在代码顶部放置
选项Strict On
,或者在项目的属性中设置它。
Public Property radius As Decimal
    Get 
        Return diameter / 2
    End Get 
End Property