【问题标题】:VB: Object "inaccessible due to its protection level" (Visual Studio 2012)VB:对象“由于其保护级别而无法访问”(Visual Studio 2012)
【发布时间】:2023-04-10 00:31:01
【问题描述】:

我在 VB (Visual Studio 2012) 中遇到了这个 SearchButton 代码的问题:

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

【问题讨论】:

  • 你写的代码没有意义。 Array 类上没有方法 SearchArray。如果你正在尝试编写扩展方法,那么这也是不正确的。
  • 可能是因为'Public artistArray() As Artist'在array.vb中,你有没有尝试过:results = Array.SearchArray(array.artistArray(), SearchTextBox.Text)
  • System.Array 和你的Array 有冲突吗?尝试重命名你的类,使其更能描述它所包含的内容。示例:Class ArtistArray Inherits Collection(Of Artist)
  • 由于SearchArray不是静态的,所以你的Array.SearchArray(...)会导致编译错误---你确定代码没问题?顺便提一句。类的名称“数组”是个坏主意
  • 您的函数返回Artist(),并且您将结果分配给类型Artist。注意到区别了吗?

标签: vb.net object public


【解决方案1】:

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

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

但是:

Dim a As New Array()
Dim first As Artist = a.artistArray(0)  ' Works

如果您想让它成为共享属性,这意味着它将成为该类本身的成员,而不是该类的每个实例,因此,实际上是全局的,您需要添加 Shared 关键字,例如这个:

Public Class Array
    Public Shared arrayArtist() As Artist
    ' ...
End Class

然后,您将能够从项目中的任何位置访问它,如下所示:

Dim first As Artist = Array.artistArray(0)  ' Works now

当然,拥有全局变量几乎总是一个糟糕的设计决策,但这是另一个话题。

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

此外,没有理由将搜索结果存储在类的字段中。如果将其范围限定为搜索方法的本地范围会好得多。如果您使用For Each 循环和List 会更简单,如下所示:

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

我什至在我的例子中加入全局变量让我很痛苦,但它确实存在。请注意,我将ToLower.Contains 更改为IndexOf,因为考虑到某些文化问题,这样更安全。我还将 click 事件处理程序中的 results 变量更改为一个数组,因为这是该方法返回的内容。

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

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

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

【讨论】:

  • 感谢您非常清楚的解释。我现在正在学习VB的基础知识,教授希望以某种方式完成。我会根据你的建议,让你知道我的想法。
【解决方案2】:

您的整个代码可以用单个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

【讨论】:

  • 在 2013 年这个答案可能还不错,但我认为 LINQ 正在死去或死去。
  • 这是一个意见。我认为很多人仍在使用 LINQ,因为 C# 领域还没有更新的技术。
  • 是的,没有什么会死去,但事情会逐渐消失。 link
猜你喜欢
  • 2015-09-26
  • 2011-09-01
  • 1970-01-01
  • 2011-04-02
  • 2011-02-07
  • 2012-01-25
  • 2022-01-18
相关资源
最近更新 更多