VB 2010'变量'未声明。由于它的保护级别,它可能无法访问

时间:2010-11-27 00:32:04

标签: vb.net variables scope declaration

我对VB来说是一个n00b,并且想知道如何在多个Subs中提供变量。它只是一个熟悉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

我的错误是:

  

“句子”未宣布。由于它的保护级别,它可能是可访问的。“

7 个答案:

答案 0 :(得分:7)

VB.NET中的变量有一个非常特殊的scope,限制了它们对代码各部分的可用性,具体取决于它们的声明方式和位置。

您的Sentence变量具有过程级范围,这意味着它仅在声明它的过程中可用。在您的情况下,它在{{1}中声明方法(“Sub”),因此它只能用于该方法中的代码。

相反,如果您希望能够访问类中任何方法中的ABCs_Load变量(Sentence始终是VB.NET中的类) ,您可以使用模块级范围声明变量。为此,您需要在Forms类中添加private field,在任何特定方法(子或函数)的。这个声明看起来像这样:

Sentences


当然,您也可以将变量声明为Private Sentence As String 而不是Public,这将使其可用于当前类之外的其他类。例如,如果您希望能够访问Private变量的内容的第二个表单,则可以在第一个表单的类中将其声明为Sentence然后从 second 表单的类中的一个方法访问它,如下所示:

Public

请注意,因为它确实存在于另一个表单(与正在访问的表中不同的类)中,所以必须完全限定对它的引用。这就像你的家人可能会称你为“迈克”,但其他人不得不称你为“麦克琼斯”,以区别于“麦克史密斯”。


有关进一步阅读,请参阅MSDN上的这些相关文章:

答案 1 :(得分:2)

你应该把:

Private Sentence As String
公共类句子下的

阅读本文以了解更多信息:http://msdn.microsoft.com/en-us/library/43s90322%28v=VS.80%29.aspx

答案 2 :(得分:0)

将行Dim Sentence As String从ABCs_Load移至Public Class Sentences之后。

这将使变量Sentence可用于Sentences类中的所有子函数。

答案 3 :(得分:0)

如果你在页面上的每个webcontrol都得到这个,那么右键单击错误的项目或文件夹和 '转换为WebApplication' 以自动生成其designer.vb文件(它们在具有相同名称的部分类中声明)。

答案 4 :(得分:0)

你应该将它声明为公共变量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




答案 5 :(得分:0)

SentenceBox.Text = Sentence 放在 End select 之后,可以解决问题。它没有让你,因为 Sentence 没有在 Button3 中定义 :) 希望这会有所帮助。

答案 6 :(得分:-1)

将其置于“公共类句子”下:

Dim Sentence As String = String.Empty

从ABCs_Load范围中删除声明。