Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net VB:对象“;由于其保护级别而无法访问”;(Visual Studio 2012)_Vb.net_Object_Public - Fatal编程技术网

Vb.net VB:对象“;由于其保护级别而无法访问”;(Visual Studio 2012)

Vb.net VB:对象“;由于其保护级别而无法访问”;(Visual Studio 2012),vb.net,object,public,Vb.net,Object,Public,我在VB(Visual Studio 2012)中使用此搜索按钮时遇到问题: Form1.VB中的此代码: Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click Dim results As Artist results = Array.SearchArray(artistArray(), SearchTextBox.Text) End Sub

我在VB(Visual Studio 2012)中使用此
搜索按钮时遇到问题:

Form1.VB中的此代码:

Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click 
    Dim results As Artist 
    results = Array.SearchArray(artistArray(), SearchTextBox.Text) 
End Sub 
我得到一个错误,
artistArray
由于其保护级别而无法访问

我是VB新手,所以我肯定这是我做错了什么,但我找不到它

我检查了拼写、可见性(
Public
)等

array.vb目前:

Public Class Array 
    Public artistArray() As Artist 
    Public searchResults(artistArray.Length) As Artist 
    Dim searchString As String 

    Public Function SearchArray(ByVal artistArray(), searchString) As Artist() 
        Dim x As Integer ' artist index variable for loop 
        Dim index As Integer = 0 ' index for results 
        For x = 0 To artistArray.GetUpperBound(0) 
            Dim temp As Artist = artistArray(x) 
            If temp.Name.ToLower().Contains(searchString.ToLower()) Then 
                searchResults(index) = artistArray(x) ' if search hit then add current item to result array 
                index += 1 ' and incr. result index 
            End If 
         Next 
         ReDim Preserve searchResults(index) 
         Return searchResults 
    End Function 

    ' ...
End Class

Public
与global不同。事实上,VB.NET甚至不支持
Global
变量,这是严格意义上的旧VB6。即使它是
公共的
,它的作用域仍然是
数组
类,因此您必须作为该类的属性访问if。但是,它也是一个实例属性,这意味着它是每个
数组
对象(即实例)的成员,而不是类本身的成员,例如:

Dim first As Artist = Array.artistArray(0)  ' Does not work
但是:

如果要使其成为共享属性,这意味着它将是类本身的成员,而不是该类的每个实例,因此,实际上是全局的,则需要添加
shared
关键字,如下所示:

Public Class Array
    Public Shared arrayArtist() As Artist
    ' ...
End Class
Dim first As Artist = Array.artistArray(0)  ' Works now
Public Class ArtistBusiness
    Public Shared Artists() As Artist

    Public Shared Function SearchArtists(artists() As Artist, searchString As String) As Artist()
        Dim results As New List(Of Artist)()
        For Each i As Artist In artists
            If i.Name.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase) >=0 Then
                results.Add(i)
            End If
        Next
        Return results.ToArray()
    End Function
End Class
Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click 
    Dim results() As Artist 
    results = ArtistBusiness.SearchArtists(ArtistBusiness.Artists, SearchTextBox.Text) 
End Sub
Public Shared Function SearchArtists(artists() As Artist, searchString As String) As Artist()
    artists.Select(Function(x) x.Name.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase) >= 0).ToArray()
End Function
然后,您将能够从项目中的任何位置访问它,如下所示:

Public Class Array
    Public Shared arrayArtist() As Artist
    ' ...
End Class
Dim first As Artist = Array.artistArray(0)  ' Works now
Public Class ArtistBusiness
    Public Shared Artists() As Artist

    Public Shared Function SearchArtists(artists() As Artist, searchString As String) As Artist()
        Dim results As New List(Of Artist)()
        For Each i As Artist In artists
            If i.Name.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase) >=0 Then
                results.Add(i)
            End If
        Next
        Return results.ToArray()
    End Function
End Class
Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click 
    Dim results() As Artist 
    results = ArtistBusiness.SearchArtists(ArtistBusiness.Artists, SearchTextBox.Text) 
End Sub
Public Shared Function SearchArtists(artists() As Artist, searchString As String) As Artist()
    artists.Select(Function(x) x.Name.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase) >= 0).ToArray()
End Function
当然,拥有全局变量几乎总是一个糟糕的设计决策,但这是另一个主题

所有这些都有点让人困惑,因为您正在调用类
Array
。从技术上讲,如果您真的愿意,您可以这样做,但我不建议这样做,因为.NET Framework已经包含了一个名为
Array
的类,这是非常基本的

此外,没有理由将搜索结果存储在类的字段中。如果将其范围限定为搜索方法的本地,则会更好。如果对每个
循环使用
,并使用
列表
,则会更简单,如下所示:

Public Class Array
    Public Shared arrayArtist() As Artist
    ' ...
End Class
Dim first As Artist = Array.artistArray(0)  ' Works now
Public Class ArtistBusiness
    Public Shared Artists() As Artist

    Public Shared Function SearchArtists(artists() As Artist, searchString As String) As Artist()
        Dim results As New List(Of Artist)()
        For Each i As Artist In artists
            If i.Name.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase) >=0 Then
                results.Add(i)
            End If
        Next
        Return results.ToArray()
    End Function
End Class
Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click 
    Dim results() As Artist 
    results = ArtistBusiness.SearchArtists(ArtistBusiness.Artists, SearchTextBox.Text) 
End Sub
Public Shared Function SearchArtists(artists() As Artist, searchString As String) As Artist()
    artists.Select(Function(x) x.Name.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase) >= 0).ToArray()
End Function
然后,你可以这样称呼它:

Public Class Array
    Public Shared arrayArtist() As Artist
    ' ...
End Class
Dim first As Artist = Array.artistArray(0)  ' Works now
Public Class ArtistBusiness
    Public Shared Artists() As Artist

    Public Shared Function SearchArtists(artists() As Artist, searchString As String) As Artist()
        Dim results As New List(Of Artist)()
        For Each i As Artist In artists
            If i.Name.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase) >=0 Then
                results.Add(i)
            End If
        Next
        Return results.ToArray()
    End Function
End Class
Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click 
    Dim results() As Artist 
    results = ArtistBusiness.SearchArtists(ArtistBusiness.Artists, SearchTextBox.Text) 
End Sub
Public Shared Function SearchArtists(artists() As Artist, searchString As String) As Artist()
    artists.Select(Function(x) x.Name.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase) >= 0).ToArray()
End Function
甚至在我的例子中加入globals都让我感到痛苦,但事实就是这样。注意,我将
ToLower.Contains
更改为
IndexOf
,因为考虑到某些区域性问题,这样更安全。我还将click事件处理程序中的
results
变量更改为数组,因为该方法返回的是数组

通过使用LINQ,您还可以进一步简化代码,如下所示:

Public Class Array
    Public Shared arrayArtist() As Artist
    ' ...
End Class
Dim first As Artist = Array.artistArray(0)  ' Works now
Public Class ArtistBusiness
    Public Shared Artists() As Artist

    Public Shared Function SearchArtists(artists() As Artist, searchString As String) As Artist()
        Dim results As New List(Of Artist)()
        For Each i As Artist In artists
            If i.Name.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase) >=0 Then
                results.Add(i)
            End If
        Next
        Return results.ToArray()
    End Function
End Class
Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click 
    Dim results() As Artist 
    results = ArtistBusiness.SearchArtists(ArtistBusiness.Artists, SearchTextBox.Text) 
End Sub
Public Shared Function SearchArtists(artists() As Artist, searchString As String) As Artist()
    artists.Select(Function(x) x.Name.IndexOf(searchString, StringComparison.CurrentCultureIgnoreCase) >= 0).ToArray()
End Function

但是我建议你在开始做任何花哨的事情之前,花更多的时间学习基础知识。

你的整个代码可以被一行
LINQ
替换

Public artists As Artist()

Public Function FindArtists(searchString As String) As Artist()
    Return artists.Where(Function(a) a.Name.ToLower().Contains(searchString)).ToArray()
End Function

你写的代码没有意义。
Array
类上没有方法
SearchArray
。如果您试图编写一个扩展方法,那么这也不正确。这可能是因为“Public artistArray()As Artist”在array.vb中,您是否尝试过这样做:results=array.SearchArray(array.artistArray(),SearchTextBox.Text)
System.array
和您的
数组
之间是否存在冲突?尝试重命名您的类,使其更具描述性。示例:
Class ArtistArray继承了(艺术家的)收藏
,因为
SearchArray
不是静态的,所以您的
Array.SearchArray(…)
将导致编译错误--您确定代码正常吗?顺便说一句,类的名称“Array”是一个坏主意。您的函数返回
Artist()
,并且您正在将结果分配给类型
Artist
。注意到区别了吗?谢谢你的解释。我现在正在学习VB的基础知识,教授希望以某种方式完成。我会根据你的建议,让你知道我的想法。在2013年,这个答案可能还可以,但我认为LINQ已经死了。这是一个观点。我认为很多人仍然在使用LINQ,因为在C#wold还没有更新的技术。没错,没有什么东西会消亡,但事情确实会消失。