ByRef 与 ByVal 说明

2023-12-05

我刚刚开始学习一个类来处理与 TCP 服务器的客户端连接。这是我迄今为止编写的代码:

Imports System.Net.Sockets
Imports System.Net

Public Class Client
    Private _Socket As Socket

    Public Property Socket As Socket
        Get
            Return _Socket
        End Get
        Set(ByVal value As Socket)
            _Socket = value
        End Set
    End Property

    Public Enum State
        RequestHeader ''#Waiting for, or in the process of receiving, the request header
        ResponseHeader ''#Sending the response header
        Stream ''#Setup is complete, sending regular stream
    End Enum

    Public Sub New()

    End Sub

    Public Sub New(ByRef Socket As Socket)
        Me._Socket = Socket

    End Sub
End Class

因此,在我的重载构造函数中,我接受参考 to an instance of a System.Net.Sockets.Socket, yes?

现在,在我的Socket属性,设置值时需要ByVal。据我了解,instance记忆中是copied, 和这个新实例被传递给value,和我的代码集_Socket在内存中引用此实例。是的?

如果这是真的,那么我不明白为什么我想使用除本机类型之外的任何属性。我想如果复制具有大量成员的类实例,性能可能会受到相当大的影响。另外,特别是对于这段代码,我想复制的套接字实例不会真正起作用,但我还没有测试过它。

不管怎样,如果你能证实我的理解,或者解释我模糊逻辑中的缺陷,我将不胜感激。


我认为您混淆了引用与值类型的概念,ByVal vs. ByRef。尽管它们的名称有点误导,但它们是正交问题。

ByVal在 VB.NET 中意味着所提供值的副本将被发送到函数。对于值类型 (Integer, Single等)这将提供该值的浅表副本。对于较大的类型,这可能效率低下。但对于参考类型(String,类实例)传递引用的副本。因为副本通过突变传递给参数=它对调用函数不可见。

ByRef在 VB.NET 中意味着对原始值的引用将发送到函数 (1)。这几乎就像在函数中直接使用原始值一样。类似的操作=将影响原始值并在调用函数中立即可见。

Socket是一个引用类型(读取类),因此将其传递给ByVal很便宜。即使它确实执行复制,它也是引用的副本,而不是实例的副本。

(1) 但这并不是 100% 正确,因为 VB.NET 实际上在调用点支持多种 ByRef。有关更多详细信息,请参阅博客条目ByRef的众多案例


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

ByRef 与 ByVal 说明 的相关文章

  • 获取ListView可见项

    我有一个ListView其中可能包含很多项目 所以它是virtualized和回收物品 它不使用排序 我需要刷新一些值显示 但是当项目太多时 更新所有内容太慢 所以我想只刷新可见项目 我怎样才能获得当前显示的所有项目的列表 我试图调查Lis
  • ASP.Net Web 应用程序 Jquery Photoviewer 和 Ajaxical 更新

    有一个错误我的网站 http new mnarfezhom com 请进入右数第三个菜单 有些图像只能通过 jquery photoviewer 显示 onlclick 这很好用 现在 当我单击页面底部的 Ajaxical 更新按钮时 问题
  • 删除 VB.NET 源代码文件中的所有注释

    Visual Studio 编辑器中是否有宏可以删除 VB NET 源文件中的所有注释 使用菜单编辑 gt 查找和替换 gt 使用正则表达式快速替换 找什么 用 来代替 1 将取代 text comment to text
  • 有没有办法以编程方式最小化窗口

    我正在做的是我有一个全屏表单 没有标题栏 因此缺少右上角的最小化 最大化 关闭按钮 我想用键盘快捷键和上下文菜单项替换该功能 但我似乎找不到触发事件来最小化表单 private void Form1 KeyPress object send
  • 如何将 System.Windows.Forms 添加到我的 .NET 5.0 项目中?

    对于我缺乏术语和理解 我提前表示歉意 我对 NET 和 Visual Studio 非常陌生 我在 Windows 7 64 位上的 Visual Studio Community 2019 版本 16 10 4 中使用 Visual Ba
  • VB.NET IntelliSense:禁用 ENTER 自动完成换行符

    When editing C code in Visual Studio 2010 the ENTER key makes IntelliSense complete the current suggestion without addin
  • .NET 的 SMS 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道 NET 的免费 SMS 库或网络服务可以让我向人们的手机发送短信吗 您实际上在寻找什么 图书馆
  • 位置 0 处没有行

    cmd CommandText select from product where prod code Trim txtprod code Text and branch w location and avail stock lt gt 0
  • 带有 case OR 运算的 VB.NET select case 语句逻辑是什么?

    我正在使用一个Or https msdn microsoft com en us library 06s37a7f aspx我的案例表达式中的声明 尽管我有一个在此范围内的值 但它没有找到匹配项 为什么不 示例代码 Select Case
  • 如何检查数据行中是否存在具有给定名称的列

    我想从数据行中的循环插入一个值 因此在数据行中输入值之前 我想检查表中是否存在特定列名称 请告诉我如何检查 首选 vb net 我得到了答案 并且它正在工作 它是 If dr Table Columns Contains columnnam
  • VB.NET 中的 IndexOf 与字符串数组

    如何在以下代码中找到字符串数组中项目的索引 Dim arrayofitems as String Dim itemindex as UInteger itemindex arrayofitems IndexOf item test Dim
  • 如何覆盖/更新当前由 IIS 提供服务的文件?

    问题 我的公司每月发布一份时事通讯 我将其托管在我们的内部网站上 我有一个供时事通讯作者上传最新版本的页面 作者上传最新的新闻通讯后 他会发送一封广播电子邮件来宣布新的新闻通讯 员工总是会检查新的时事通讯并向作者发送反馈以及需要进行的更正
  • 正则表达式 VB.Net 正则表达式.替换

    我正在尝试执行一个简单的正则表达式查找和替换 在字符串中的一些数字后面添加一个制表符 如下所述 From a users 12345 badges To a users 12345 badges 我正在使用以下内容 s regex repl
  • .NET 配置(app.config/web.config/settings.settings)

    我有一个 NET 应用程序 它具有用于调试和发布版本的不同配置文件 例如 调试 app config 文件指向开发SQL服务器 http en wikipedia org wiki Microsoft SQL Server它启用了调试并且发
  • 使用自定义验证器进行 ASP.Net 字数统计

    我正在处理的 ASP Net 2 0 项目的要求将某个字段限制为最多 10 个单词 不是字符 我当前正在使用带有以下 ServerValidate 方法的 CustomValidator 控件 Protected Sub TenWordsT
  • 如何在一个文本框中搜索多个值并在 DataGridView vb.net 中显示

    有没有一种方法可以在一个文本框中搜索 过滤多个值 我正在 OPIS 列中搜索两个或多个不同的单词 短语 Example 搜索 sveder 然后搜索 din 374 然后搜索 TiN 结果将是具有此描述的所有项目 我有这段代码 但是当搜索与
  • 非托管代码调用 vb.net 回调

    我正在将处理 COM 对象事件的 vb net 应用程序 可能用 VB6 编写 从框架 1 1 升级到 WPF 2 0 3 5 代码 为简洁起见 简化了对象名称 public class MyClass Private WithEvents
  • 我仍然没有获得代表

    使用委托不是可以帮助处理一些异步情况吗 我尝试了以下操作 但我的用户界面仍然挂起 你到底什么时候使用代表 Public Class Form1 Private Delegate Sub testDelegate Private Sub Bu
  • 如何使用鼠标拖动和移动winform

    我知道如何通过添加以下代码来 拖动和移动 winform Protected Overrides Sub WndProc ByRef m As Message If m Msg 163 And ClientRectangle Contain
  • 为什么 VB.NET 和 C# 中针对值检查 null 存在差异?

    In VB NET http en wikipedia org wiki Visual Basic NET有时候是这样的 Dim x As System Nullable Of Decimal Nothing Dim y As System

随机推荐