引用类型作为参数

2023-12-03

所以我深入阅读 Jon Skeet 的 C# 并遇到了一些误解,比如引用类型总是通过 ref 传递,所以我决定自己做一个小实验。

正如您在下面的代码中看到的,我有一个简单的 Car 类,其中一个属性在调用构造函数时初始化为 500。我还有 NullIt 函数,该函数将 null 分配给参数值,以及 SpeedUp 方法,该方法仅更改 Speed 属性值。

检查 main 方法,您可以看到我实例化了一个 Car 对象,然后将该对象传递给静态 SpeedUp 方法,并且 Speed 值更改为 1000,但当我将其传递给静态 NullIt 方法时,该对象保持不变。由此,我唯一可以假设的是对象是按值传递的,而字段/属性是按引用传递的。这是正确的吗?

我知道如果我使用 ref 关键字传递它将会返回 null。

  class Program
   {
    static void Main(string[] args)
    {
        Car c = new Car();
        Car.SpeedUP(c);
        Car.NullIt(c);
    }

    class Car
    {
        public int Speed { get; set; }

        public Car() { Speed = 500; }


        public static void SpeedUP(Car c)
        {
            c.Speed = 1000;
        }

        public static void NullIt(Car c)
        {
            c = null;
        }
    }
}

由此我唯一可以假设的是该对象已通过 值和字段/属性通过引用传递。这是 正确的?

并不真地。对象的地址是按值传递的。

所以当你这样做时:

Car.SpeedUP(c);

现在你的方法参数SpeedUp和你的领域c在调用者中,两者都指向内存中的同一位置。从而改变了作品的属性。

但对于您的电话:

Car.NullIt(c);

你的方法参数c和来电者的c两者都指向同一位置。但是由于您将 null 分配给您的参数c,现在它不指向任何内存位置,而是指向原始/调用者的c仍然指向相同的内存位置。

考虑以下:

当您将参数传递给方法时,内存中的两个引用将指向相同的地址,如下所示:

enter image description here

但是当你分配null它不会改变其他参考。

enter image description here

第一个参考(在呼叫者中)仍然指向相同的位置,只是方法参数现在指向null.

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

引用类型作为参数 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 异步运行 mocha js(类似 AND)

    我可以在浏览器中异步加载 mocha 模块吗 我用柴肯定可以做到 有什么解决方法可以让 mocha 以类似 amd 的风格工作吗 require config baseUrl scripts paths mocha framework mo
  • 查找并打印 DIV 中的所有链接

    我试图找到 div 中的所有链接 然后打印这些链接 我正在使用 Simple HTML Dom 来解析 HTML 文件 这是我到目前为止所得到的 请阅读内联评论并让我知道哪里出错了 include simple html dom php h
  • 解析python中的嵌套括号,按级别抓取内容

    显然这个问题经常出现 读完后 思考了一会儿这个问题 我写了一个函数来返回任意数量的嵌套 中包含的内容 该函数可以轻松扩展到任何正则表达式对象 在此发布以供您的想法和考虑 任何重构建议将不胜感激 注意 我还是Python新手 不想弄清楚如何引
  • 检测到自引用循环 - 将数据从 WebApi 返回到浏览器

    我正在使用实体框架 并且在将父级和子级数据获取到浏览器时遇到问题 这是我的课程 public class Question public int QuestionId get set public string Title get set
  • 删除所有行并保留最新的 x left

    我有一张像这样的桌子 entryid roomid 1 1 2 55 3 1 4 12 5 1 6 44 7 1 8 3 9 1 现在我想删除 roomid 1 的所有条目并保留 剩余 roomid 1 中的最新 3 个 最好只用一个命令
  • 如何在通过括号表示法访问的元素上使用 jQuery 方法?

    jQuery 对象中的元素可以通过括号表示法访问 如下所示 div 0 但在这种情况下不能使用 jQuery 方法 还有其他方法可以访问某些元素或使用 jQuery 方法吗 如果您尝试获取集合中的第一个 jQuery 对象 请使用 jQue
  • 使用 pyfpdf 将 Base64 图像插入 pdf

    我在 python 中使用 pyfpdf 来生成 pdf 文件 我有一个 Base64 我想将其插入到 pdf 文件中 而不必将其另存为文件系统中的图像 但 pyfpdf 图像函数仅接受文件路径 fpdf image name x None
  • 选择组合的子集

    假设我有一个 20 X 5 矩阵 我想选择矩阵的子集并用它们进行一些计算 进一步假设每个子矩阵是 7 X 5 我当然可以这样做 ncomb lt combn 20 7 这给了我 7 个行索引的所有可能组合 我可以使用它们来获取子矩阵 但对于
  • 将 System.Web.UI.WebControls.Image 转换为 System.Drawing.Image?

    我似乎无法转换它 有什么帮助吗 它们是两个完全不同的对象 System Web UI WebControls Image是一个能够渲染 HTML 的控件 它将使浏览器下载并显示指定的图像 System Drawing Image是一个类 能
  • RODBC 和 Access - 加载数据

    我正在尝试将一些数据从 Access 数据库加载到 R 中 我能找到的所有说明都说使用 odbcConnectAccess file mdb 但我似乎无法加载此函数 是否已被替换或重命名 还有其他方法可以做到这一点吗 我已经用库 RODBC
  • 适用于 Android 和 GSON 的 ProGuard

    我正在为我的 Android 项目设置 ProGuard 我的项目也使用GSON 我研究了 ProGuard 配置与 GSON 和 Android 的兼容性 并发现了 google gson 提供的这个示例https code google
  • Python Seaborn 绘制空白直方图

    我正在尝试使用 python 中的seaborn 绘制直方图 但它给我的只是一个空白的数字 这里是describe 我的专栏 代码 plt subplots figsize 7 7 sns histplot data contratos x
  • 如何动态向react-bootstrap-table列添加href?

    我在react中使用react bootstrap table作为数据表 这里从后端获取c data作为JSON对象 如何动态地将ahref添加到react bootstrap table中的列 const data id 0 name J
  • 将列表传递给 subprocess.run

    我有一个脚本 其中包含一个列表 该列表只是我想传递给的一些参数subprocess run像这样 commands bash command 1 bash command 2 这是我的代码 commands bash command 1 b
  • Pandas read_csv 更改以 0 开头的列

    我有一个脚本 可以从 csv 文件中读取一些邮政编码 邮政编码的格式如下 zipcode 75180 90672 01037 20253 09117 31029 07745 90453 12105 18140 36108 10403 764
  • Bitbucket 管道:gcloud 崩溃 (UnicodeDecodeError)

    编辑 我想指出 如果我在计算机上使用云 sdk 手动部署 则不会发生此问题 仅限管道 再次编辑 我在 gcloud 应用程序部署中添加了 verbosity debug 这是生成的内容 Do you want to continue Y n
  • Jersey REST 服务上的用户身份验证

    我正在开发一个 REST 应用程序 它使用 Jersey 框架 我想知道如何控制用户身份验证 我查了很多地方 找到最接近的文章是这样的 http weblogs java net blog 2008 03 07 authentication
  • 当 RecyclerView 正在计算布局或尝试从 recyclerview 中删除项目时滚动时,无法调用此方法

    我正在尝试从 recyclerview 中删除我的项目 但我总是收到错误 java lang IllegalStateException 无法调用此方法 RecyclerView 正在计算布局或滚动 我正在使用notify datasetc
  • DataTable Wrapper 或如何将 UI 与业务逻辑解耦

    我正在使用 Web 表单 C Asp net 众所周知 在这个模型中 UI和业务逻辑经常是混合在一起的 如何有效地将它们分开呢 我想使用的例子是 我有一个 GridView 和一个 DataTable GridView 绑定到 DataTa
  • 引用类型作为参数

    所以我深入阅读 Jon Skeet 的 C 并遇到了一些误解 比如引用类型总是通过 ref 传递 所以我决定自己做一个小实验 正如您在下面的代码中看到的 我有一个简单的 Car 类 其中一个属性在调用构造函数时初始化为 500 我还有 Nu