想要使用的朋友访问修饰符在哪里?

时间:2012-03-21 15:21:40

标签: vb.net friend access-modifiers

我见过的Friend修饰符的唯一地方是WinForms设计器,正如Why is the modifier set to Friend in Winforms?VB.NET: what does the 'friend' modifier do?中提到的那样。

朋友修饰符似乎是一个几乎任意宽的访问级别,是为解决VB中的一些历史性架构问题而创建的,我只是想知道是否有人有意义的继续使用它?

我有一些愿望只将方法暴露给给定的命名空间,以便将相关的对象集合的功能集合在一起并管理它们的任何非线程安全方法,同时将安全的公共方法暴露给更广泛的范围在同一个程序集中。朋友没有此访问级别。可能是一个必然结果的问题,那就是我对程序集和命名空间的使用与预期的不一致?

在许多情况下,由于程序集具有严格的层次结构,因此无法将功能分离到不同的程序集中,从而导致具有相互但不同的对象组,这些对象可以访问彼此不安全的方法。

修改 虽然我知道修饰语的功能,但我很好奇人们对它有什么实际用途,因为我没有遇到过这样一个合适解决方案的情况。

2 个答案:

答案 0 :(得分:6)

我在类中使用它来防止在我的程序集 之外使用函数,方法或属性。

在程序集内部,FriendPublic执行相同的操作,因此,它对开发人员来说是友好。但是,如果从外部装配中使用该类,则标记为Friend的所有内容都将不可用,而Public将是。{/ p>

C#等价物是internal。名称internal可能提供比其预期用途Friend更好的定义。

这是一个任意的例子。我有一个DLL,其中包含一堆自定义控件,都需要绘制某些图像:

Friend Class ControlDraw

  Public Shared Sub DrawArrow(ByVal g As Graphics, ByVal r as Rectangle, _
                              ByVal ad As ArrowDirection, ByVal ac As Color)

    //' Draw Special Arrow:

  End Sub

End Class

我可以在项目的所有控件中使用此代码。但是当我发布DLL并让其他人使用它时,最终用户无法使用DrawArrow函数,只能从项目内部获得控件。

为什么这样?

如果它是Public,那么我永远不会改变参数而不会破坏该函数的任何消费者。但是因为它是我自己的方法,我可以为BackColor或其他任何东西添加另一个参数,并在我自己的项目中更新所有使用它的控件。

我基本上说,Friend类或函数只是让我担心,而不是最终用户。一旦你向外界创造了一些Public,你就会失去对它的一点控制。

也是从Eric Lippert answer on using Internal

中找到的
  

内部的要点不是让鲍勃生活困难。它允许您控制项目A对功能,生命周期,兼容性等所做的昂贵承诺。

答案 1 :(得分:3)

你所拥有的不是语言问题,而是一般的OOP教条。

Friend修饰符可能会造成混淆,因为它的行为与C ++等旧语言中的行为不同。它的行为方式不同的原因是因为不一样。

Friend修饰符可以访问程序集作用域中的声明对象,这意味着程序集中的任何类都可以访问该对象,但它仍然无法用于使用程序集的代码。如果有助于了解C#Internal Modifier

至于为什么OOP违背朋友修饰语的C ++方式超出了我的知识,但也许this other SO question可能会有帮助。