"Public \ Friend"与"Friend \ Friend"的区别

3

最近我一直在阅读关于VB.Net中访问修饰符的文章,但有些东西我无法真正理解:一个(或模块)中的元素如何继承其封闭块的修饰符?

例如,假设您在程序集中有一个名为BlaFriend类,并且该类具有一个公共方法Foo

Friend Class Bla
    Public Sub Foo
    (...)
End Class

如果将Foo设置为Friend,它的行为是否与此时不同?如果是,你会建议使用哪一个?

Friend Class Bla
    Friend Sub Foo
    (...)
End Class

谢谢!


1
你的标题是否暗示了你的第二个代码块应该是 Public Class Bla 和 Friend Sub Foo? - Code Maverick
2
请查看此帖子:http://stackoverflow.com/questions/5652564/please-explain-behavior-when-class-and-member-have-different-access/5655177#5655177 - Chris Haas
2个回答

1
在我看来,无论一个人为 Foo 指定了 public 还是 Friend,都无关紧要,因为封装类只在这个程序集中可用。
可以选择限制方法/属性的访问修饰符而不是类的访问修饰符。在您的示例中,方法 Foo 也可以是私有的,这意味着该方法将不可用于调用者,包括在同一程序集中的其他类。
可以通过类/实例访问方法。如果类是 private 的,那么一个 public 方法有什么用呢?
编辑:顺便说一下,你可以向调用者(位于其他程序集中)返回一个 Bla 的实例。在这种情况下,如果 Foo 被声明为 public,则调用者应该能够调用该方法。这是我的假设。

谢谢您的回答!当然,对于私有类来说,公共方法几乎没有任何意义(至少我不知道有什么意义;) - Clément
@shahkalpesh:如果“Bla”有“Friend”修饰符,则无法将“Bla”的实例传递到另一个程序集。您最好通过反射来实现这一点。 - Alex Essilfie
这是一个相对陈旧的话题,但我想提一下,在私有类中使用公共成员可能非常有用 - 例如在模块内部。该类对该模块是私有的,其公共成员可供模块访问。然而,该类的私有成员在类外的模块中不可用。 - izzy

1
如果有人跳过访问“Bla”所需的反射障碍,那么他们不需要再次这样做来调用“Public Sub Foo”,但是对于“Friend Sub Foo”,他们需要这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接