Friend 访问修饰符打算用在哪里?

2024-04-20

我看到使用 Friend 修饰符的唯一地方是在 WinForms 设计器中,如中提到的为什么Winforms中修饰符设置为Friend? https://stackoverflow.com/questions/3707055/why-is-the-modifier-set-to-friend-in-winforms and VB.NET:“friend”修饰符有什么作用? https://stackoverflow.com/questions/2772815/vb-net-what-does-the-friend-modifier-do.

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

我希望仅向给定的命名空间公开方法,以便将相关对象集合的功能组合在一起并管理它们的任何非线程安全方法,同时将安全的公共方法公开到更广泛的范围相同的装配。此访问级别尚不存在,但 Friend 存在。那么,可能的一个必然问题是,我对程序集和命名空间的使用是否与预期不一致?

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

Edit:虽然我知道修饰符的功能,但我很好奇人们使用它的实际目的是什么,因为我还没有遇到过它是正确解决方案的情况。


我在类中使用它来防止使用函数、方法或属性outside我的集会。

从装配体内部,Friend and Public做同样的事情,因此,它是friendly给开发商。但是,如果从外部程序集中使用该类,则标记的所有内容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

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

为什么要这样做?

如果它是Public,那么我永远无法在不破坏该函数的任何使用者的情况下更改参数。但由于这是我自己的方法,我可以为 BackColor 或其他参数添加另一个参数,并更新我自己的项目中使用它的所有控件。

我基本上是说,一个Friend类或函数只是让我担心,而不是最终用户担心。一旦你做了某事Public对于外界来说,你会失去一点对它的控制。

还从一个埃里克·利珀特 (Eric Lippert) 回答使用Internal https://stackoverflow.com/a/3016168/719186:

内部的重点并不是让鲍勃的生活变得困难。它允许您控制项目 A 在功能、生命周期、兼容性等方面做出的昂贵承诺。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Friend 访问修饰符打算用在哪里? 的相关文章

  • string() 类型的值无法转换为字符串

    我不断收到此错误 我尝试了所有可能的方法 但它仍然显示 String 的值类型无法转换为字符串 这是代码 Private Sub Label1 Click sender As Object e As EventArgs Handles La
  • System.IO.Compression 和 ZipFile - 提取并覆盖

    我使用标准 VB NET 库来提取和压缩文件 它也可以工作 但是当我必须提取并且文件已经存在时 问题就出现了 我使用的代码 Imports Imports System IO Compression 崩溃时我调用的方法 ZipFile Ex
  • 使用 VB.Net 的 GhostText

    大家好 我尝试创建一个幽灵文字在文本框上使用标签 我使用的是VB Net2005 我用这段代码完成了这个 Public Class frmDataEntry Private Sub PhantomTextLastName If txtLas
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht
  • 将 MIME 编码的附件发布到 Ariba Supply Network 时出现问题

    我在尝试使用 VB NET 和 WebRequest 对象发布一些 cXML 文本和附件时遇到问题 我相信我正在格式化我希望正确发布的数据文本 因为它与 Ariba 提供的示例相匹配 我不确定的是我是否正确使用 WebRequest 对象来
  • 如何从网页启动 Windows 应用程序?

    我们有一个公司内部网 并且权力机构认为拥有一组代表大多数代表使用的应用程序 Outlook Excel 少数其他应用程序 的图标 链接会很好 这个想法是 如果安装了应用程序 单击链接 图标将在客户端计算机上启动该应用程序 有人曾经有过这样的
  • 使用VB.NET查找当前登录用户的用户名

    我正在尝试获取当前用户的用户名 当我登录时Johnny Smith并在没有管理员权限的情况下运行我的应用程序 它将返回正确的用户名 Johnny Smith 但问题是 当我右键单击并选择 以管理员身份运行 时 Windows 将提示我管理员
  • 如何在VB.NET中画一条线

    我正在尝试用 VB NET 画一条简单的线 我的代码如下 但是当我运行代码时 只显示表单 没有线 我在这里做错了什么 Public Class Form1 Dim pen As System Drawing Graphics Private
  • 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/免注册 COM?

    我必须在 C DLL 中使用 VB COM DLL 我弄清楚了如何从 C DLL 访问 VB COM DLL 并且它可以工作 现在我遇到了一个问题 我必须使用隔离的 COM 免注册 COM 因为我无法在必须使用它的每台 PC 上注册 DLL
  • 表单上的 KeyEvents 只能与 CTRL 结合使用

    Code Private Sub KeyHandling ByVal sender As Object ByVal e As System Windows Forms KeyEventArgs Handles Me KeyDown Sele
  • 由于继承抽象类而禁用设计器?

    我有一个项目的解决方案 那个项目中有 40 或 50 种形式 我制作了 4 个基本形式 所有其他形式都可以继承 所有 4 个基本表单都继承 System Windows Forms Form 几乎 90 的形式继承了前 2 个基本形式之一
  • 使用正则表达式验证器上传文件不适用于仅 Firefox IE

    我有一个带有 RegularExpressionValidator 的 FileUpload 和以下验证表达式 a zA Z 2 w w w gif jpg JPG JPEG GIF jpeg png bmp 3dm 3dmf ai drw
  • 通过 VB.NET 创建/编辑文本文件

    如何在 VB NET 中编写以下算法的代码 Procedure logfile if C textfile txt exist then open the textfile else create the textfile end if g
  • 如何使用 VB.NET 打开受密码保护的共享网络文件夹?

    我需要在网络上打开受密码保护的共享文件夹才能访问 Access 97 数据库 如何打开文件夹并输入密码 在这里找到http www mredkj com vbnet vbnetmapdrive html http www mredkj co
  • 从特定 IP 地址发送 SOAP 请求

    我有一个具有多个 IP 地址的系统 但我只能从一个 IP 地址发起 SOAP 请求 我如何在 VB NET 中获得它 我从来没有这样做过 看起来很复杂 首先 阅读自定义 ASMX 客户端代理的方法 http johnwsaunders3 w
  • 设置表单的背景颜色

    Private Sub HScrollBar1 Scroll ByVal sender As Object ByVal e As ScrollEventArgs Handles HScrollBar1 Scroll Me BackColor
  • 设置国际货币格式

    我有一个 asp net 应用程序 我们正在 全球化 过程中 我将 currentculture 和 currentUICultre 设置为适当的值 并且货币按预期使用货币格式显示 即 FormatCurrency nPrice 产生 en
  • 将签名位图转换为签名字符串(很奇怪的一个)

    基本上我需要将位图图像转换为字符串 但这不是常见的 困境在于该字符串由两部分组成 1 积分 2 线路 我需要将图像转换为由 分隔的两个部分 我得到的一个例子是 221A 221A270A270A25032503200720071716171
  • 如何在VB函数中添加可选参数/默认值参数?

    如何在 Visual Basic 中创建一个包含可选参数的方法 Use the Optional关键字并提供默认值 可选参数必须是最后定义的参数 以避免创建不明确的函数签名 Sub MyMethod ByVal Param1 As Stri
  • 通过名称访问表单的控件

    不确定这篇文章的标题是否准确 我试图通过在循环中 组合 它们的名称来访问 Windows 窗体控件及其属性 但我似乎找不到相关文档 使用VB net 基本上 假设我有以下内容 Dim myDt As New DataTable Dim ro

随机推荐