为什么我的公共变量表现不如预期?

时间:2014-10-01 15:26:28

标签: vb.net

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

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

3 个答案:

答案 0 :(得分:2)

这不是你认为它做的事情:

Public radius As Decimal = diameter / 2

radius变量不会将引用保存到diameter变量以供将来计算。此赋值语句使用当前值计算一次,并将结果放在radius中。 diameter的当前值为:

Public diameter As Integer

嗯,这是未分配的。所以它默认为00 / 20。因此,radius正在初始化为0,并且它从未在代码中再次分配。所以它始终是0

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

Public Property radius As Decimal
    Get 
        Return diameter / 2
    End Get 
End Property

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

答案 1 :(得分:0)

你已经让自己陷入了无意识的循环。

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

您还应该知道更新直径时Radius不会更新。您只需为其设置初始值即可。无论何时直径发生变化,您都必须重新计算半径。

答案 2 :(得分:0)

你宣称半径=直径/ 2 但是,当遇到此声明时,未定义直径。

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