2016-02-07 2 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 

Когда я пытаюсь использовать значение я возложенную на него в другом подклассе он говорит:

Variable «craftability» используется, прежде чем оно было присвоено значение. Исключительное исключение ссылки может возникнуть во время выполнения.

и возвращает нулевое значение.

+1

Установите контрольную точку в CheckBox1_CheckedChanged, чтобы увидеть, действительно ли назначаемая способность рисования была назначена. Кроме того, убедитесь, что объявлен только один экземпляр объявления. – xpda

+0

Используйте имя класса для доступа к общим переменным. 'ClassWhereVariableDefined.craftability'. – Fabio

+0

Вы уверены, что вы хотите объявить общую переменную, а не статическую переменную? –

ответ

0

Похоже, вы указали Shared переменную вне класса здесь. Общие переменные используются только экземплярами классов. Например, если вы хотите, чтобы отслеживать, сколько экземпляров класса есть, вы бы объявить общую переменную в классе, как этот консольного приложения

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 для использования, я не могу быть более точным. Я боюсь. Надеюсь, это поможет.

Смежные вопросы