C# 参数传递(引用类型参数)

news2024/11/23 22:27:40

目录

一,引言

二,引用类型参数作为值参数传递

三,引用类型参数作为引用参数传递


一,引言

方法中参数的传递方式主要有值参数传递引用参数传递(ref,out),而参数有可以分为值类型参数引用类型参数,这里主要讲一讲引用类型参数的值/引用参数传递。

对于一个引用类型对象,不管是将其作为值参数传递还是作为引用参数传递,我们都可以在方法成员内部修改它的成员。

  1. 将引用类型对象作为值参数传递 如果在方法内创建一个新对象并赋值给形参,将切断形参与实参之间的关联,并且在方法调用结束后,新对象也将不复存在。
  2. 将引用类型对象作为引用参数传递 如果在方法内创建一个新对象并赋值给形参,在方法结束后该对象依然存在,并且是实参所引用的值。

二,引用类型参数作为值参数传递

    class Program
    {
        static void Main(string[] args)
        {
            MyClass a1 = new MyClass();
            Console.WriteLine("方法执行前"+a1.Val);
            RefAsParameter( a1);
            Console.WriteLine("方法执行后"+a1.Val);
        }
        static void RefAsParameter(  MyClass f1)
        {
            //设置对象成员
            f1.Val = 50;
            Console.WriteLine("修改对象成员"+ f1.Val);
            //创建新对象并赋值给形参
            f1 = new MyClass();
            Console.WriteLine("创建新对象后"+f1.Val);
        }
        class MyClass
        {
            public int Val = 20;//初始化字段为20
        }
    }

打印结果:

方法执行前20
修改对象成员50
创建新对象后20
方法执行后50

内存分配:

在这里插入图片描述

可以看到:

  1. 在方法开始时,实参和形参都指向堆中相同的对象。(相当于把实参浅拷贝给形参)
  2. 在给成员赋值后,它们仍指向堆中相同的对象。(形参,实参同时改变)
  3. 在创建新对象后,开辟了新的内存空间。(实现了深拷贝)
  4. 方法完成后,形参内存被回收。

三,引用类型参数作为引用参数传递

 相较于值参数传递,作为引用参数传递只是在传递参数时,引入ref关键字。

    class Program
    {
        static void Main(string[] args)
        {
            MyClass a1 = new MyClass();
            Console.WriteLine("方法执行前"+a1.Val);
            RefAsParameter(ref a1);
            Console.WriteLine("方法执行后"+a1.Val);
        }
        static void RefAsParameter( ref MyClass f1)
        {
            //设置对象成员
            f1.Val = 50;
            Console.WriteLine("修改对象成员"+ f1.Val);
            //创建新对象并赋值给形参
            f1 = new MyClass();
            Console.WriteLine("创建新对象后"+f1.Val);
        }
        class MyClass
        {
            public int Val = 20;//初始化字段为20
        }
    }

 打印结果:

方法执行前20
修改对象成员50
创建新对象后20
方法执行后20

内存分配:

在这里插入图片描述

可以看到:

  1.  在方法开始时,实参和形参都指向堆中相同的对象,栈中有相同的地址。
  2. 修改成员的值后,实参和形参均改变
  3. 创建新对象后,实参和形参堆中的值改变。
  4. 方法完成后,释放掉形参的内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/748878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

巩固一下NodeJs

1、初始化(确保当前电脑有node环境) npm init 2、安装express npm i expressnpm i ws文件结构 3、编写相关代码启动node服务(server.js) //导入下列模块,express搭建服务器,fs用来操作文件、ws用来实现webscoket const express require("expr…

使用halcon深度学习实现缺陷检测

使用halcon深度学习实现缺陷检测 前言 Halcon是一种功能强大的机器视觉库,提供了许多用于图像处理和分析的工具和算法。它也集成了深度学习算法,可以用于缺陷检测和其他视觉任务。下面是一些使用Halcon深度学习算法实现缺陷检测的步骤: 1.…

写好“提示”改变“智造未来”-GPT4提示词驶入代码优化驾驶座心得

开篇 在前端科技的新浪潮中,Artificial Intelligence (AI)的逐渐成熟与发展引领着我们向前。其中OpenAI的GPT4提供了我们一种新的可能,帮助我们优化代码,使编程变得更加轻松。在这篇文章中,我们将一同探究如何在1-2分钟内,依靠GPT的提示词优化我们的代码,并展现出我们在…

F - Weight of the System of Nested Segments - 思维+排序

分析&#xff1a; 将每个点的权重以及坐标存下来&#xff0c;按权重排序&#xff0c;找出前n个点然后按坐标排序&#xff0c;再按要求输出最大区间到最小区间。 代码&#xff1a; #include <bits/stdc.h>using namespace std;typedef long long ll; typedef pair<in…

Python高频面试题——如何实现列表去重

在招聘Python自动化测试岗位面试时&#xff0c;最常问的一个编码实战问题就是&#xff1a; 一个包含多个值的列表&#xff0c;但存在重复值&#xff0c;如何实现去重&#xff1f;当然大家也可以结合实际业务情况进行提问&#xff0c;例如&#xff1a;统计今天有多少个不同的用…

Day51|309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 1.题目&#xff1a; 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff0…

电脑如何提高图片dpi分辨率?在线修改图片dpi的操作方法

想要给微信换个背景图片&#xff0c;但是又发现像素尺寸不合适&#xff0c;需要调整图片大小&#xff08; https://www.yasuotu.com/size&#xff09;&#xff0c;那么怎么可以修改图片大小呢&#xff1f;今天分享的这款图片处理工具可以快速将图片大小修改&#xff0c;一起来看…

线性代数 4 every one(线性代数学习资源分享)

Linear Algebra 4 Every One 版权说明&#xff0c;以下我分享的都是一个名叫Kenji Hiranabe的日本学者&#xff0c;在github上分享的&#xff0c;关于Gilbert Strang教授所撰写的《Linear Algebra for Everyone》一书的总结&#xff0c;更像是一个非常精美的线性代数手册&#…

深入解析 MQTT 中基于 Token 的认证和 OAuth 2.0

除了前几篇文章中提到的认证方法&#xff0c;本文将对其他认证方法进行深入分析和探讨。 具体而言&#xff0c;我们将深入了解基于 Token 的认证和 OAuth 2.0&#xff0c;阐述它们的原理并展示它们在 MQTT 中的应用。 基于 Token 的认证 让我们先来认识一下基于 Token 的认证…

网站窗口标题旁的图标生成与替换

电脑端浏览器打开网站后窗口顶部的标签标题左边会有一个网站图标的显示&#xff0c;那个图标需要的是 .ico 格式的文件 在线免费生成ico图标的网址 只需要打开网址选择文件、选择尺寸生成下载&#xff0c;然后放到个人项目中&#xff08;一般放在public目录中&#xff09;&am…

IDEA中右侧栏和底部栏不见了

IDEA中右侧栏和底部栏不见了 在开发中&#xff0c;IDEA的右侧栏目maven、database等栏目不见了 右侧栏中和底部没东西。 问题解决&#xff1a; View—>Appearance–>Tool Windows Bars 选中即可。 选中之后&#xff0c;出现

mac安装Golang开发环境及快速入门

目录 一、Mac brew 安装go环境 1.1 安装步骤 1.2 设置GOPATH 及环境变量 1.3 编写第一个go程序 二、快速入门 1.1 快速入门需求 1.2 go学习&#xff08;自用&#xff09; 一、Mac brew 安装go环境 1.1 安装步骤 1&#xff09;终端输入&#xff0c;也可以指定下载go版本…

黑客(信息安全网络安全)自学手册

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 行为&#xff1a;从编程开始掌握&#xff0c;前端后端、通信协议、什么都学。 缺点&#xff1a;花费时间太长、实际向安全过渡后可用到的关键知识并不多。…

uniapp自定义头部,计算状态栏和导航栏高度超简单三步

效果图 1.pages.json 页面给要自定义头部的页面加入一行代码 "navigationStyle":"custom" {"path": "pages/index/index","style": {"navigationBarTitleText": "","navigationStyle":"…

代码随香录day16

104. 二叉树的最大深度 思路&#xff1a;这道题推荐用层序遍历递归的方式 递归三要素&#xff1a; 终止条件&#xff1a;当当前node为空时候 单层递归逻辑&#xff1a;分别向node的左子树和右子树进行递归&#xff0c;定义left和right接受返回值 递归参数&#xff1a;root 代…

wincc与300以太网通讯教程在建材行业矿粉磨生产自动化控制系统中应用

内容摘要 上位机与S7-300PLC通信采用以太网通信&#xff0c;通讯模块采用捷米特ETH-S7300-JM01以太网通讯模块&#xff0c;捷米特ETH-S7300-JM01通讯模块直接插到CPU315-2DP的DP口上。 项目介绍 立磨PLC控制系统&#xff1a; 立磨是一种理想的大型粉磨设备&#xff0c;广泛应…

最详细的下载安装PicGo图床配合Typora使用

1.node.js下载安装1.2 检验安装成功 2. PicGo下载安装3. 配置Gitee【配合PicGo使用】3.1 获取PicGo的token 4. 配置PicGo4.1 下载插件4.2 配置图床[Gitee]4.3 配置Typora 5. 上传图片到Gitee【重要】6.解决配置错误 1.node.js下载安装 【node.js下载链接】点击跳转页面&#x…

安卓JNI从0到1入门教程(三)

前面两篇博客介绍了jni相关内容&#xff0c;以及怎么在Android中简单使用&#xff0c;demo比较简单。这次来讲讲复杂一点的java和C/C的互相调用。 下面我们将要实现的功能是将Java对象传递给C&#xff0c;然后用C的对象接收值&#xff0c;最后把C对象的值回传给Java层。 一、…

HP Laser 136nw打印机与win10实现Wifi直连

HP Laser 136nw打印机与win10实现Wifi直连 HP Laser 136nw打印机设置HP Smart HP Laser 136nw打印机设置 打开打印机WIFI开关&#xff0c;使其他设备可以搜索到 查看打印机设备名称&#xff0c;用于设备搜索 查看打印机WIFI密钥&#xff0c;用于windows与打印机直连 根据…

深度学习开源框架

文章目录 1. 深度学习框架1.1 概述1.2 深度学习框架—关于组件1.2.1 组件—张量1.2.2 基于张量的各种操作1.2.3 计算图1.2.4 自动微分工具1.2.5 拓展包 2. 主流深度学习框架2.1 市面上主流框架2.2 本土深度学习框架2.3 深度学习框架的标准化--ONNX 3. Tensorflow3.1 Tensorflow…