2016-02-07 178 views
0

我需要帮助分配一个值给我做的公共共享变量。为共享变量赋值?

Public Shared craftability As String = "Craftable" 
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged 
    If CheckBox1.Checked = True Then 
     craftability = "Non-Craftable" 
    Else 
     craftability = "Craftable" 
    End If 

当我尝试使用我分配给它的另一个子集中,它说的价值:

变量“craftability”用于已分配一个值之前。运行时可能会导致空引用异常。

并返回空值。

+1

在CheckBox1_CheckedChanged中设置一个断点,以查看是否真的赋予了craftability的值。另外,确保只声明一个可加工性实例。 – xpda

+0

使用类名访问共享变量。 'ClassWhereVariableDefined.craftability'。 – Fabio

+0

你确定要声明一个共享变量而不是静态变量吗? –

回答

0

看起来你已经在这里在类之外声明了一个共享变量。共享变量仅用于类的实例。例如,如果你想跟踪有多少类有实例,你会在类中声明一个共享变量类似这样的控制台应用程序

Sub Main() 
    Dim t1 As New testclass 
    Dim t2 As New testclass 
    Console.WriteLine(t2.Count) 
    Console.ReadKey() 
End Sub 

Private Class testclass 
    Private Shared instanceCount As Integer 

    Public Sub New() 
     instanceCount += 1 
    End Sub 

    Public ReadOnly Property Count 
     Get 
      Return instanceCount 
     End Get 
    End Property 
End Class 

你最终得到的是被写入到控制台。而共享变量只能由TestClass的每个实例访问。

OK静态变量就像过程中声明的局部变量。但是,对于常规局部变量,当过程完成时,局部变量将被销毁。静态变量继续存在并保留其最新值。下次您调用相同的过程时,静态变量不会再次声明并重新初始化,因为它仍然存在并且包含您分配给它的最新值。一个静态变量只有在它被定义的类或模块被销毁时才被销毁。

所以,你的代码也许应该是

Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged 
    Static Dim craftability As String = "Craftable" 
    If CheckBox1.Checked = True Then 
     craftability = "Non-Craftable" 
    Else 
     craftability = "Craftable" 
    End If 

然而,看着您提供的代码,如果你想craftability到整个类是可用的,那么就宣告它,你已经做 - 外部分,但没有共享关键字。不知道你想如何使用craftability,我不敢更准确。希望这有助于