Vb.net VB:对象“;由于其保护级别而无法访问”;(Visual Studio 2012)
我在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
搜索按钮时遇到问题:
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还没有更新的技术。没错,没有什么东西会消亡,但事情确实会消失。