2016-02-07 174 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,我不敢更準確。希望這有助於