请说明班级和会员有不同的访问权限时的行为

时间:2011-04-13 16:33:36

标签: vb.net reflection scope

我遇到了一个问题,这个问题挑战了我对VB.Net中访问修饰符的理解。我有一个班级宣布为朋友。如果我将其属性声明为Public,则应用程序可以正常工作。如果我将它们声明为Friend,则应用程序将失败。

在此之前,我相信,在宣布为朋友的一个班级中,无论我是宣布成员是公共还是朋友,都不会产生任何功能差异。我认为类访问声明将其限制应用于所有嵌套实体,因此声明为Public的嵌套属性被有效地限制,就像它们已被声明为Friend一样。显然,我错了。任何人都可以解释访问修饰符的确如何工作,或者指向相关文档吗?

以下是对情况的更详细描述:我有一个名为StripTask的Friend类,其属性名为StripDate,HistorianDate和TaskText。我有一个StripTasks(称为_StripTasks)的集合,它被用作Syncfusion GridDataBoundGrid的数据源。绑定的工作方式,我需要将StripTask属性的名称传递给每个网格列,以便每列知道要显示的数据。它最终看起来像这样:_DataBoundGrid.GridBoundColumns(1).MappingName =“StripDate”。当映射的属性声明为Public时,它可以工作。当映射的属性被声明为Friend时,网格将填充正确的行数,但每个单元格都是空的。

作为一个后续问题,最好避免使用这种Syncfusion绑定方法,这需要我将属性名称作为字符串传递?感觉好像我在招惹麻烦。

1 个答案:

答案 0 :(得分:2)

不,类的访问级别不会流向成员和方法。 In VB all methods are Public if you don't specify anything。如果您将某些内容标记为Friend,则表示您不希望程序集之外的代码能够访问它,这听起来与您所看到的完全相同。

修改

重要的是要理解,类级别的访问规则主要涉及实例化和键入。想象一下下面的DLL使用反射来查看给定对象的属性(这几乎肯定是Syncfusion所做的):

Option Explicit On
Option Strict On

Public Class Class1
    Public Sub Process(ByVal obj As Object)
        Dim T = obj.GetType()
        Dim Props = T.GetProperties()
        For Each P In Props
            Trace.WriteLine(P.Name)
        Next
    End Sub
End Class

然后在一个单独的程序集中想象以下WinForms应用程序,并引用上述DLL:

Option Explicit On
Option Strict On

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim X As New ClassLibrary1.Class1()
        Dim FC As New FriendClass()
        Dim PC As New PrivateClass()
        X.Process(FC)
        X.Process(PC)
    End Sub

    Private Class PrivateClass
        Public Property PublicProp As String
        Friend Property FriendProp As String
        Private Property PrivateProp As String
    End Class
End Class

Friend Class FriendClass
    Public Property PublicProp As String
    Friend Property FriendProp As String
    Private Property PrivateProp As String
End Class

您可以将Friend类和Private类传递给另一个完全有效的程序集。但是,另一方面,DLL将无法访问FriendPrivate属性,只能访问Public属性。运行此操作时,您将在立即窗口中看到两行PublicProp,这是它可以看到的唯一属性。