VB 2010 'переменная' не объявлена.Может быть недоступен из-за уровня защиты - PullRequest
3 голосов
/ 27 ноября 2010

Я вроде n00b для VB, и мне было интересно, как сделать переменную доступной для нескольких подпрограмм. Это просто тестовое приложение для знакомства с VB. Мой код:

Public Class Sentences

Private Sub SentenceBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SentenceBox.TextChanged
    If Me.Text = Trim(Sentence) Then
        MsgBox("Good job!")
        Main_Menu.Show()
        Me.Close()
    End If
End Sub

Private Sub ABCs_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim random As Integer = CInt((Rnd() * 10) + 1)
    Dim Sentence As String


    Select Case random
        Case 1
            Sentence = "The quick brown fox jumped over the lazy dog!"
        Case 2
            Sentence = "Hi there, how are you doing?"
        Case 3
            Sentence = "What is the answer to life?"
        Case 4
            Sentence = "The cat in the hat was fat."
        Case 5
            Sentence = "John and Sam had always been fat."
        Case 6
            Sentence = "The snow is falling hard."
        Case 7
            Sentence = "Here, dinner is always served nightly."
        Case 8
            Sentence = "The dog barks at the passing cars."
        Case 9
            Sentence = "The dust settles on the books."
        Case 10
            Sentence = "Fire burns brightly when you add kerosene."
    End Select
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    SentenceBox.Text = Sentence

    End Sub
End Class

Моя ошибка:

"Приговоры" не объявлены. Он может быть доступен из-за уровня защиты. "

Ответы [ 6 ]

7 голосов
/ 27 ноября 2010

Переменные в VB.NET имеют очень специфическую область действия , ограничивая их доступность различными частями вашего кода в зависимости от того, как и где они объявлены.

Ваша переменная Sentence имеет область действия уровня процедуры, что означает, что она доступна только в рамках процедуры, в которой она была объявлена. В вашем случае она объявлена ​​в методе ABCs_Load (" Sub "), поэтому он будет доступен только для кода в этом методе.

Если вместо этого вы хотите иметь доступ к переменной Sentence в любых методов вашего класса (Forms всегда являются классами в VB.NET), вы можете объявить переменная с областью действия уровня модуля. Для этого вам нужно добавить личное поле к вашему классу Sentences, вне любого конкретного метода (Sub или Function). Эта декларация будет выглядеть примерно так:

Private Sentence As String


Конечно, вы также можете объявить переменную как Public вместо Private, что сделает ее доступной для других классов за пределами текущего класса. Например, если у вас была форма секунда , для которой вы хотели иметь доступ к содержимому вашей переменной Sentence, вы могли бы объявить ее как Public в классе первой формы, а затем получить доступ к ней из один из методов в втором классе формы, например:

MessageBox.Show(myForm1.Sentence)

Обратите внимание, что, поскольку он находится в другой форме (классе, отличном от того, в котором он доступен), вы должны полностью уточнить ссылку на него. Это похоже на то, как ваша семья может называть вас «Майк», но другие должны называть вас «Майк Джонс», чтобы отличать вас от «Майка Смита».


Для дальнейшего чтения также см. Эти связанные статьи на MSDN:

2 голосов
/ 27 ноября 2010

Вы должны поставить:

Private Sentence As String

под Общественные предложения

Прочитайте это, чтобы узнать больше: http://msdn.microsoft.com/en-us/library/43s90322%28v=VS.80%29.aspx

0 голосов
/ 08 января 2016

вы должны объявить его как публичную переменную public sentence as string=string.empty, но если бы вы были, я бы просто объявил это во всем примере класса

public class NameOfClass
  dim sentence as string=string.empty

  public sub nameOfSub
    --you can use the variable 'sentence' here
  end sub
  public sub nameOfSub2
    --you can use the variable 'sentence' here
  end sub
end class
0 голосов
/ 13 июня 2013

Если вы получите это для каждого веб-элемента управления на странице, щелкните правой кнопкой мыши проект или папку с ошибкой и 'Преобразовать в WebApplication' , чтобы автоматически сгенерировать файлы designer.vb (где они объявлены в частичном классе с тем же именем).

0 голосов
/ 28 ноября 2010

Переместить строку Dim Sentence As String из ABCs_Load в сразу после Public Class Sentences.

Это сделает переменную Sentence доступной для всех подпрограмм и функций в классе Sentences.

0 голосов
/ 27 ноября 2010

Поместите это в "Public Class Sentences":

Dim Sentence As String = String.Empty

и удалите объявление из области ABCs_Load.

...