为什么在传递对象时使用“ref”关键字?

2024-02-01

如果我将对象传递给方法,为什么要使用 ref 关键字?这不是默认行为吗?

例如:

class Program
{
    static void Main(string[] args)
    {
        TestRef t = new TestRef();
        t.Something = "Foo";

        DoSomething(t);
        Console.WriteLine(t.Something);
    }

    static public void DoSomething(TestRef t)
    {
        t.Something = "Bar";
    }
}


public class TestRef
{
    public string Something { get; set; }
}

输出是“Bar”,这意味着该对象作为引用传递。


Pass a ref如果你想改变对象是什么:

TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(ref t);

void DoSomething(ref TestRef x)
{
  x = new TestRef();
  x.Something = "Not just a changed TestRef, but a completely different TestRef object";
}

调用 DoSomething 后,t不参考原文new TestRef,但指的是完全不同的对象。

如果您想更改不可变对象的值,例如,这也可能很有用。 Astring。您无法更改 a 的值string一旦它被创建。但是通过使用ref,您可以创建一个函数来将字符串更改为另一个具有不同值的字符串。

使用这不是一个好主意ref除非需要。使用ref赋予方法自由地将参数更改为其他内容,方法的调用者将需要进行编码以确保他们处理这种可能性。

此外,当参数类型是对象时,对象变量始终充当对象的引用。这意味着当ref使用关键字您已经获得了对参考的引用。这允许您执行上面给出的示例中描述的操作。但是,当参数类型是原始值时(例如int),那么如果在方法内部赋值这个参数,方法返回后传入的参数值就会改变:

int v = 1;
Change(ref v);
Debug.Assert(v == 5);
WillNotChange(v);
Debug.Assert(v == 5); // Note: v doesn't become 10

void Change(ref int x)
{
  x = 5;
}

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

为什么在传递对象时使用“ref”关键字? 的相关文章

  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • 在VB.NET中获取文件修改日期

    我的文件夹中有许多文件 我需要获取最后修改日期 所以我用了 FDate IO File GetLastWriteTime FName 对于某些文件 它工作正常 但对于其他文件 我得到的日期为 1 1 1601 但是当我在 Windows 资
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • FluentAssertions ShouldNotThrow 无法识别异步方法/Func

    我正在尝试检查异步方法是否抛出具体异常 为此 我使用 MSTEST 和 FluentAssertions 2 0 1 我已经检查过这个关于 Codeplex 的讨论 http fluentassertions codeplex com wo
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • 表单上的 KeyEvents 只能与 CTRL 结合使用

    Code Private Sub KeyHandling ByVal sender As Object ByVal e As System Windows Forms KeyEventArgs Handles Me KeyDown Sele
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

    Size of char signed char and unsigned char由 C 标准本身定义为 1 个字节 我想知道为什么它没有定义sizeof bool also C 03 标准 5 3 3 1 说 sizeof char s
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir

随机推荐

  • 将大文件读入 R

    我是 R 的新手 但我知道它会因 大 文件而窒息 我正在尝试读取 200MB 的数据文件 我已经尝试过 csv 格式 并将其转换为制表符分隔的 txt 但在这两种情况下 我在文件加载之前就用完了 4GB RAM R 使用 4GB 或内存来加
  • VirtualBox 上的 Android x86:Android 已连接但不在线

    我正在尝试使用 Oracle VirtualBox 配置 Android x86 运行机器 以便它可以与 Eclipse 一起使用 我在使我的虚拟机 在线 时遇到一些麻烦 我通过在 Android 终端模拟器中键入以下内容将手机连接到 ad
  • 检查元组中的元组中是否存在元素

    我有一个元组列表 如下所示 CODES apple reddelicious caramel sweetsticky banana yellowfruit 检查该元组中是否存在值的最佳方法是什么 例如我希望能够说 apple in CODE
  • 清理 PHP 中的文件路径

    我希望确保我的小程序的安全 以便潜在的恶意用户无法查看服务器上的敏感文件 path home gsmcms public html central app webroot GET file if file exists path echo
  • Azure DevOps 管道中存在不明确的参数“HEAD^”

    我在网上看到很多示例如何在 CI 中的 Azure DevOps 管道期间获取更改文件 只需使用简单的代码 changedFiles git diff name status HEAD HEAD 但是当我尝试在 yaml 管道中使用它时出现
  • 蚂蚁的战斗策略

    这个问题是指谷歌赞助的人工智能挑战 http aichallenge org 每隔几个月举行一次的竞赛 参赛者需要提交一个能够自主与其他机器人玩家玩游戏的机器人 刚刚结束的比赛名为 蚂蚁 您可以阅读其所有规范here http aichal
  • 使用 LINQ 进行现有查询

    我想使用 LINQ 获取员工列表 这些员工必须在TypeOfWorks列出typeofWork通过 Id 在论证中 public class Employee public virtual IList
  • Codeigniter - 使用 set_value() 填充表单进行编辑(不涉及 POST)

    我有一个包含表单的视图 带有输入字段和单选按钮 该表单需要填充数据库中的数据 以便将其用作数据编辑表单 我已使用 set value 函数进行表单验证 其中在发布后从同一控制器调用视图 但是如何在没有 POST 的情况下使用 set val
  • 加速 Numpy 数组/OpenCV cv2 图像的迭代

    我有 3 个形状 gt 500 500 的 numpy 数组 我正在尝试同时迭代它们 我尝试了两种不同的方法 但都很慢 Here Ix Ix blur Ix Iy blur and Iy Iy blur大小相同 我正在尝试寻找特征并将其绘制
  • 将 JSON jQuery Ajax 发送到 PHP 并返回

    我在通过 Ajax 将 JSON jQuery 数组发送到 PHP 脚本时遇到问题 这里有什么问题 var tee voting image img attr id var vote 1 var thing tee tee vote vot
  • 为kendo数据源提供一个角度范围变量

    我目前正在尝试用远程数据填充剑道网格 Kendo 有它自己的函数来获取数据 但我想使用我创建的角度工厂 所以我有一个工厂 它有一个函数 getSkills 该函数从我的api获取所有技能对象 angular module MyApp fac
  • 最佳实践 - 从 Web 服务抛出异常

    我们有一个 ASMX Web 服务 我们使用 ajax jQuery 从 ASP NET 应用程序调用它 我们的网络方法的典型示例如下 WebMethod public void DoSomething BusinessObject myP
  • git-svn 忽略大型二进制文件

    我正在使用一个大型 svn 存储库 超过 30 000 个修订版 我使用 git svn 的成功有限 我的主要问题是 svn 存储库包含对大型二进制文件 30MB 的频繁更新 我不关心这些文件的历史记录 但我确实关心这些文件的当前版本 如果
  • sizeof 在可变长度数组上的行为(仅限 C)

    我的问题是具体如何sizeof 当传递的参数是动态数组可变长度数组时的行为 让我们考虑一个例子 int fun int num of chars char name arr num of chars 0 Do something retur
  • IHttpControllerFactory 在哪里?

    微软网站说有一个IHttpControllerFactory http msdn microsoft com en us library system web http dispatcher ihttpcontrollerfactory v
  • 在 PHP 中使用当前 http 请求的查询字符串获取路径[重复]

    这个问题在这里已经有答案了 我需要从当前请求的 URL 中获取带有查询字符串的路径 例如 如果当前 URL 是 http www example com example test hi php randomvariable 1 我想要这个
  • android 拾取音频文件

    我需要从 SD 卡获取音频文件并播放 我认为这可以通过获取音频文件的 URI 来完成 因此 要选择音频文件 我使用以下代码 Intent intent new Intent intent setType audio intent setAc
  • 由 java.lang.SecurityException 引起:UID 10243 无权 content://media/external/audio/media/5927 [user 0]

    我是 Android 开发新手 正在尝试调试我们的应用程序崩溃的原因 当我们尝试向 Android 设备发送推送通知时 我们遇到了崩溃 这是我需要解决的入职问题 我不知道是什么导致了这个问题 该问题可以在 Android N O 和 P 中
  • C# 中的 Thread.Sleep()

    我想用 C 制作一个图像查看器Visual Studio 2010 http en wikipedia org wiki Microsoft Visual Studio Visual Studio 2010几秒钟后一张一张地显示图像 i 0
  • 为什么在传递对象时使用“ref”关键字?

    如果我将对象传递给方法 为什么要使用 ref 关键字 这不是默认行为吗 例如 class Program static void Main string args TestRef t new TestRef t Something Foo