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

J C*_*ins 3 vb.net access-modifiers friend

我见过Friend修饰符的唯一地方是在WinForms设计器中,为什么修改器在Winforms中设置为Friend?VB.NET:'朋友'修饰符有什么作用?.

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

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

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

编辑: 虽然我知道修饰符的功能,但我很好奇人们对它的实际目的,因为我没有遇到过这样一个合适的解决方案.

Lar*_*ech 6

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

从一个组件内,FriendPublic做同样的事情,因此,它是友好的开发人员.但是如果从外部组件中使用该类,则标记的所有内容都Friend将不可用,而Public将是.

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
Run Code Online (Sandbox Code Playgroud)

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

为什么这样?

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

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

还从Eric Lippert的回答中Internal找到了这个:

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