从C++角度讲解C#Out和ref的区别

2023-11-05

本文不同于以往的文章,而是透过c++和c#两种语言来讲解out和ref的区别

在C#中,out和ref都是用来传递参数的关键字。它们的主要区别在于:

ref:ref参数表示对变量的引用。这意味着当您将参数传递给一个使用ref参数的方法时,方法可以修改原始变量的值。在调用方法之前,必须为ref参数初始化变量。

out:out参数类似于ref参数,但有一个重要的区别,即在调用方法之前不需要为out参数初始化变量。在方法中,必须为out参数分配一个值。out参数的常见用法是从方法中返回多个值

总结:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,ref是有进有出,out是只出不进

下面是一个示例,演示了如何使用ref和out参数


//使用ref参数
void ModifyValue(ref int num)
{
    num = num + 10;
}

int number = 5;
ModifyValue(ref number);
Console.WriteLine(number); //输出15

//使用out参数
void GetValues(out int x, out int y)
{
    x = 10;
    y = 20;
}

int a, b;
GetValues(out a, out b);
Console.WriteLine(a); //输出10
Console.WriteLine(b); //输出20

在C++中,没有像C#中那样的out参数,但可以通过引用(ref)来实现类似的功能。在C++中,ref和out的区别如下:

引用(ref):引用是指向变量的别名,用&符号声明。当您将引用传递给一个函数时,函数可以通过引用修改原始变量的值。与C#不同,C++中的引用不需要在初始化时进行赋值。

指针:指针是一个变量,它存储另一个变量的地址。通过指针,函数可以修改原始变量的值。指针与引用类似,但它们有不同的语法和语义。

下面是一个示例,演示了如何使用引用和指针来实现类似于C#中的out参数的功能:


// 使用引用
void getValues(int &x, int &y)
{
    x = 10;
    y = 20;
}

int a, b;
getValues(a, b);
cout << a << endl; // 输出10
cout << b << endl; // 输出20

// 使用指针
void getValues(int *x, int *y)
{
    *x = 10;
    *y = 20;
}

int a, b;
getValues(&a, &b);
cout << a << endl; // 输出10
cout << b << endl; // 输出20

透过两种语言,我们更容易理解一些基础的比较绕的概念,这样的学习方法希望你也能学会

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

从C++角度讲解C#Out和ref的区别 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • ue4 unreal NDisplay插件 简易使用 三折幕 详细...

    仅支持4 27版本 NDisplay文档 https docs unrealengine com 4 27 en US WorkingWithMedia IntegratingMedia nDisplay Overview Switchbo
  • 2020-04-09

    每日书单 每日书单 1 There is only one time in a person s life when he can make a difference That is the moment 2 Can coral be ke
  • Tracy vue3 小笔记 2 - 和 Vue 2 的区别汇总

    1 可以有多个根元素 2 子传父的 emit 多了一步在default 里预定义
  • 什么是java句柄_JAVA中的术语:句柄是啥意思

    句柄的本质 一个唯一的整数 作为对象的身份id 区分不同的对象 和同类中的不同实例 程序可以通过句柄访问对象的部分信息 句柄不代表对象的内存地址 句柄和指针的区别 程序不能通过句柄直接阅读文件中的信息 指针是可以的 从所起的作用这点来说 句
  • IDEA整合Tomcat服务器(IDEA没有Application Server选项)

    IDEA整合Tomcat服务器 IDEA没有Application Server选项 我使用的IDEA创建Java Enterprise的界面如下 没有Application Server选项 不要慌 在Settings中设置Applica
  • LOAM误差函数、代价函数的雅克比矩阵详细推导,点到线和点到面误差函数求导

    LOAM误差函数的导数详细推导 前言 LOAM对于激光SLAM的发展起到了举足轻重的作用 他提出了点到线和点到面的误差函数 通过优化的方法 得到了非常不错的激光里程计效果 我猜测作者Zhang Ji很可能是从点到线和点到面的ICP算法中找到
  • HTML入门学习笔记

    我是目录 1 标题 段落标签 2 文本格式化标签 3 布局标签 div span 4 图像标签 5 相对路径 绝对路径 6 链接标签 锚点标签 7 表格标签 显示数据 8 列表标签 布局页面 9 表单标签 为了收集用户信息 1 标题 段落标
  • Box2D v2.3.0 用户指南(第四章)

    第四章 碰撞模块 Collision Module 4 1简介 碰撞模块包含形状 shape 以及操作它们的函数 此外 碰撞模块还包括dynamictree和broad phase来加快大型系统的碰撞处理速度 碰撞模块被设计为可独立于动态系
  • OrCAD进行DRC时报错的解决办法(持续添加中~~)

    1 WARNING ORCAP 1829 Possible pin type conflict 报错原因 器件的引脚类型和直接连接的信号类型冲突了解决方法 此类警告可直接忽略 或按如下方法处理 1 单击出现警告的器件 右键选择 Edit P
  • Python编程小知识-1-省略号运用

    默默无闻的省略号很好用 在Python中 一切皆对象 省略号也不例外 在Python 3中你可以直接写来得到它 gt gt gt Ellipsis gt gt gt type
  • 复习C语言指针---数组指针

    复习C语言指针 第二章 数组指针 数组指针 复习C语言指针 第二章 数组指针 数组指针定义 数组指针和二维数组 数组指针和指针数组 总结 数组指针定义 数组指针 其本质是指针 是指向一整个数组的指针 一 这里 要说明指向数组的指针和指向一整
  • mysql fulltext_干货!从零开始学习MySQL

    关注我们吧 查看更多干货文章 视频 回复 数据 还有数据分析相关资料领取 每周更有免费直播课 有问题也可私信咨询小编哦 一 为什么要用全文索引 我们在用一个东西前 得知道为什么要用它 使用全文索引无非有以下原因 like查询太慢 json字
  • openwrt 作为旁路由教程,适用于小米主路由

    小米路由作为主路由 openwrt作为旁路由时 手机上无线会提示无法访问外网 这个是由于小米路由自身解析导致 参考了好几篇文章 自己也趟了几遍才设置好 openwrt旁路由设置 刷好固件的新 Openwrt 网关 一般默认的IP地址是192
  • React Ref 其实是这样的

    大家好 我是Mokou 好久没有冒泡了 最近一直在看研究算法和数据结构方面的东西 但是似乎很多前端不喜欢看这种东西 而且目前本人算法方面也很挫 就不献丑了 当然了 最近也开始研究React了 这篇文章主要是讲述 Ref 相关的内容 如有错误
  • linux驱动开发学习笔记八:配置内核必不可少的工具--menuconfig

    一 常见的几种配置工具介绍 在配置内核的时候会有很多配置方法 make menuconfig make xxx defconfig 直接修改 config 注意 其中menuconfig是一个图形化配置工具 在后面我们会着重介绍 xxx d
  • 这篇文章把数据讲透了(四):数据挖掘

    一 前言 上一期文章中 我们已经了解到 数据 是一个庞大的体系 如下图所示 并用了 洗菜 择菜 的例子 为大家讲解数据清洗的含义 而今天笔者主要给大家讲解当净菜备好后 如何对净菜进行加工烹饪 让它变成有价值 有意义的美味佳肴 即数据挖掘的过
  • 好用的DNS服务器及各自特点

    1 114 114 114 114 在国内是比较出名的解析服务 因为解析速度快 同时连接三网 移动 电信 联通 横跨服务器延迟也不高 也可以满足用户需求 2 123 125 81 6 现在有很多人用360软件也会随着使用360DNS服务器
  • 大数据处理需要用到的九种编程语言

    随着大数据的热潮不断升温 几乎各个领域都有洪水倾泻般的信息涌来 面对用户成千上万的浏览记录 记录行为数据 如果就单纯的Excel来进行数据处理是远远不能满足的 但如果只用一些操作软件来分析 而不怎么如何用逻辑数据来分析的话 那也只是简单的数
  • 软件工程经济学知识点总结

    软件工程经济学知识点总结 题型 选择 20分 判断 20分 计算 20分 综合 25分 论述 15分 绪论 工程经济性 生产性工程项目的直接目的是盈利 非生产性工程项目的直接目的虽不是经济性的 但建设和运行中也必须重视成本 一切工程都具有经
  • 从C++角度讲解C#Out和ref的区别

    本文不同于以往的文章 而是透过c 和c 两种语言来讲解out和ref的区别 在C 中 out和ref都是用来传递参数的关键字 它们的主要区别在于 ref ref参数表示对变量的引用 这意味着当您将参数传递给一个使用ref参数的方法时 方法可