C# 中的 ref 和 out 与 C++ 中的指针相同吗?

2023-11-28

我刚刚用 C# 创建了一个交换例程,如下所示:

static void Swap(ref int x, ref int y)
{
    int temp = x;
    x = y;
    y = temp;
}

它与此 C++ 代码执行相同的操作:

void swap(int *d1, int *d2)
{
    int temp=*d1;
    *d1=*d2;
    *d2=temp;
}

也是如此ref and outC# 中的指针之类的关键字,无需使用unsafe code?


他们的局限性更大。你可以在指针上说 ++,但不能在ref or out.


EDIT注释中有些混乱,所以要绝对清楚:这里的重点是与指针的功能进行比较。您无法执行与以下操作相同的操作ptr++ on a ref/out,即使其寻址内存中的相邻位置。确实(但与此无关)您可以执行相当于(*ptr)++,但这将是将其与values,而不是指针。


可以肯定的是,它们在内部只是指针,因为堆栈不会移动,并且 C# 是经过精心组织的,因此ref and out始终引用堆栈的活动区域。


EDIT再次绝对清楚(如果从下面的示例中还不清楚的话),这里的重点不是ref/out can only指向堆栈。就是那个when它指向堆栈,语言规则保证它不会成为悬空指针。这种保证是必要的(并且在这里相关/有趣),因为堆栈只是根据方法调用退出丢弃信息,而没有检查以确保任何引用者仍然存在。

反之当ref/out引用 GC 堆中的对象,这些对象能够根据需要保持活动状态也就不足为奇了:GC 堆的设计正是为了将对象保留其引用者所需的任何时间长度,并提供固定(请参阅下面的示例)以支持不能通过 GC 压缩移动对象的情况。


如果您曾经在不安全的代码中使用过互操作,您会发现ref与指针密切相关。例如,如果 COM 接口声明如下:

HRESULT Write(BYTE *pBuffer, UINT size);

互操作程序集会将其变成这样:

void Write(ref byte pBuffer, uint size);

你可以这样做来调用它(我相信 COM 互操作的东西负责固定数组):

byte[] b = new byte[1000];
obj.Write(ref b[0], b.Length);

换句话说,ref到第一个字节可以让您访问所有内容;它显然是指向第一个字节的指针。

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

C# 中的 ref 和 out 与 C++ 中的指针相同吗? 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 不同类型的指针可以互相分配吗?

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

随机推荐

  • LINQ 扩展方法不适用于 EnumerableRowCollection

    我有以下代码行 var availableClients Controller ListClientsForCurrentUser as DataTable AsEnumerable 我想利用 LINQ 的扩展方法 MSDN like An
  • C++ 赋值运算符 - 编译器生成还是自定义?

    我有一个中等复杂的 C 类 它保存从光盘读取的一组数据 它包含浮点数 整数和结构的折衷组合 现在已得到普遍使用 在主要代码审查期间 有人问我们是否有自定义赋值运算符 或者我们依赖编译器生成的版本 如果有 我们如何知道它正常工作 好吧 我们没
  • matplotlib 无法在 Windows 10 上加载 ft2font

    我正在使用 Anaconda 5 0 1 和 Python 2 7 14 当我打开 jupyter 笔记本并尝试运行以下命令时 matplotlib inline 我收到以下错误 ImportError Traceback most rec
  • 当一个 ng-repeat 项目被移除时,如何为剩余 ng-repeat 项目的移动设置动画?

    我有一个使用 ng repeat 的动态项目列表 当发生某些事情时 物品可能会消失 我已经使用 ng animate 顺利地处理了这些项目的移除动画 但在它们消失后 剩余的项目只是简单地捕捉到它们的新位置 我怎样才能顺利地制作这个动作的动画
  • VSTS(Azure Devops) 的“ssh -T”身份验证成功,但“git clone”失败

    我最近创建了第二个密钥来访问 Visual Studio Team Services ssh keygen t rsa b 4096 C email protected 所以我现在有两把钥匙 id github id vsts 两个密钥似乎
  • 水平对齐图像 CSS

    我想水平对齐我的三个图像而不是垂直对齐 实现此目的最简单的方法是什么 example div div img src http lilliemcferrin com wp content uploads 2013 09 vivid flow
  • Valgrind 报告一个非常简单的 C 程序的错误

    我正在学习C语言艰难地学习 C 我上线了练习6虽然我可以让它工作 但 valgrind 报告了很多错误 这是从文件中剥离的最小程序ex6 c include
  • 检查 GCM 消息的状态

    我正在尝试使用 GCM 向我的手机发送消息 我收到一条消息 id 0 回复 但我的手机没有显示任何消息 有没有办法检查消息的状态 已发送 等待等 没有 如果您收到 message id xxxx 响应 则 GCM 服务器已接受您的请求并将尽
  • 在 NativeScript 上获取本地 json 文件

    如何获取本地的大json数据 我已经尝试过这个 但没有成功 var sa require shared resources sa json var array new observableArrayModule ObservableArra
  • 如何避免 Globalize3 将属性的回退翻译返回到特定上下文?

    我正在使用 Globalize3 和 easy globalize accesors 进行网站的国际化 本地化 现在我正在调整表单来管理具有可能翻译的字段 假设我有一个名为 Role 的类 class Role translates nam
  • 在 PyDev 中使用鼻子测试进行交互式调试

    我正在使用 PyDev 与 Aptana 一起 来编写和调试 Python Pylons 应用程序 并且我想在调试器中逐步完成测试 是否可以通过 PyDev 启动鼻子测试并在断点处停止 这是我使用 eclipse Pydev 运行鼻子测试的
  • 安装 WSL2 后,Android Studio 模拟器无法在 Windows 11 上运行

    Setup Windows 11 家庭版 21H2 22000 132 AMD 锐龙 5900X WSL2 Android studio 最新版本 也尝试了最新的测试版 问题 一旦我安装 WSL2 模拟器就会停止工作 它给出以下错误消息 C
  • 将 R Markdown 渲染到 MS Word 时页面上的弹性表的对齐方式

    我在定制方面非常幸运flextable我的 R Markdown 文档中的表格 但是 我正在努力更改页面上表格的位置 默认情况下 表格似乎在页面居中 我希望我的一张表格与左边距对齐 我怎么做 我刚刚添加了一个选项来启用它 现在您可以使用 c
  • Python 错误后保持 Windows 控制台打开

    我的机器 winxp home 上的文件关联是直接用python解释器打开python脚本 如果我双击 python 脚本 控制台窗口就会运行 一切都很好 只要脚本中没有语法错误 在这种情况下 控制台窗口会打开一会儿 但会立即关闭 读取错误
  • 查找字符串中子字符串的出现次数

    为什么以下算法不会对我停止 在下面的代码中 str是我正在搜索的字符串 并且findStr是我要查找的字符串出现次数 String str helloslkhellodjladfjhello String findStr hello int
  • scipy.sparse 默认值

    稀疏矩阵格式 dok 假设不在字典中的键的值等于零 有什么办法让它使用除零之外的默认值吗 另外 有没有办法计算稀疏矩阵的对数 类似于常规 numpy 矩阵中的 np log 该功能不是内置的 但如果您确实需要此功能 您应该能够编写自己的功能
  • 使用 javascript 模拟文档上的点击

    是否可以使用 javascript 模拟网页上的点击 但无需定义特定元素 而只是指定文档 我本来想做这样的事情 如果该位置碰巧有一个链接 那么就会按下这个 function simulateClick x y var evt window
  • Spark Streaming中batch间隔、滑动间隔和窗口大小的区别

    我是新火花流 我知道窗口大小需要是批处理间隔的倍数 但滑动区间是如何运作的呢 如果我有 3 作为窗口大小 2 作为滑动间隔 那么当我计算字数时不会有重叠吗 或者滑动间隔和批次间隔应该相同吗 Here是文档的链接 让我们来看看这些概念 批次间
  • 从 shell 脚本编辑属性文件中的属性值

    标题说明了一切 我需要将我不知道的属性值替换为不同的值 我正在尝试这个 bin bash sed i s myprop myprop newvalue g file properties i get sed e expression 1 c
  • C# 中的 ref 和 out 与 C++ 中的指针相同吗?

    我刚刚用 C 创建了一个交换例程 如下所示 static void Swap ref int x ref int y int temp x x y y temp 它与此 C 代码执行相同的操作 void swap int d1 int d2