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

目录

一,引言

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

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


一,引言

方法中参数的传递方式主要有值参数传递引用参数传递(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.hqwc.cn/news/21968.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构造稀疏矩阵例子

构造稀疏矩阵的目的是在处理具有大量零元素的大规模数据时,节省内存空间和计算资源,并提高计算效率。稀疏矩阵是一种特殊的矩阵,其中包含许多零元素和一些非零元素。 #include "pcl.h" #include "common.h" #include &qu…

设计模式——责任链模式

责任链模式 定义 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有对象处理它为止。 优缺点 优点 能将请求和处理分开。请求者可以不用知道是谁处理的&a…

Java设计模式之结构型-代理模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 1、静态代理类图 2、动态代理类图 三、角色设计 四、案例分析 1、静态代理 2、JDK动态代理 3、Cglib动态代理 五、总结 一、基础概念 代理模式是一种结构型设计模式,它用一个代理对象来封装一个目标对象,通常…

Python+docx实现python对word文档的编辑

前言: 该模块可以通过python代码来对word文档进行大批量的编辑。docx它提供了一组功能丰富的函数和方法,用于创建、修改和读取Word文档。下面是docx模块中一些常用的函数和方法的介绍: 安装:pip install docx 一、准备一个word文档…

MYSQL执行一条SELECT语句的具体流程

昨天CSDN突然抽风 我一个ctrlz把整篇文章给撤掉了还不能复原 直接心态崩了不想写了 不过这部分果然还是很重要,还是写出来吧 流程图 这里面总共有两层结构Server层 储存引擎 Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包…

WebSocket理解

WebSocket理解 WebSocket定义与HTTP关系相同点:不同点:联系总体过程 HTTP问题长轮询Ajax轮询 WebSocket特点 WebSocket 定义 本质上是TCP的协议 持久化的协议 实现了浏览器和服务器的全双工通信,能更好的节省服务器资源和带宽 与HTTP关系 相同点: 基于…

【bug】flameshot在ubuntu上的4K屏幕,双屏幕上用不了截图

问题 直接在4K屏幕上运行flameshot截图,直接黑屏 主屏 :4K 副屏:2k 解决 2.1长按1-2秒开机键,先回到桌面。 2.2 设置主屏缩放为125% 2.3 设置键盘快捷键命令为env QT_AUTO_SCREEN_SCALE_FACTOR1 flameshot gui 替代flameshot的…

zeppelin的hive使用

zeppelin的hive使用 配置项 default.driver org.apache.hive.jdbc.HiveDriver default.url jdbc:hive2://192.168.xxx.xxx:10000 default.user hiveHive使用:点击create new note Default Interpreter选择hive

动态表单实现原理

目录 动态表单是什么 动态表单的关键 前后端职责 数据库与表结构 功能实现与改进建议 动态表单是什么 静态表单是很常见,也是常规做法,其表单的结构是固定的,通常情况下一个表单对应数据库的一张表,表单中一个数据项对应数据表的一…

idea创建webapp文件夹

结果的图片: 第一步: file-》project structure 第二步: 修改路径,点击右侧“Deloyment descriptors”下面的笔进行修改。 // 增加了src\main // web修改为了webapp C:\Users\www12\Desktop\huwantiku2\src\main\webapp\WEB-IN…

【Java】JVM执行流程、类加载过程和垃圾回收机制

JVM执行流程执行引擎本地方法接口运行时数据区方法区堆虚拟机栈(线程私有)本地方法栈(线程私有)程序计数器(线程私有) 堆溢出问题类加载类加载的过程加载连接验证准备解析 初始化 双亲委派机制 垃圾回收死亡对象的判断算法引用计数算法可达性分析算法 垃圾回收的过程标记-清除算…

Linux常用命令——emacs命令

在线Linux命令查询工具 emacs 功能强大的全屏文本编辑器 补充说明 emacs命令是由GNU组织的创始人Richard Stallman开发的一个功能强大的全屏文本编辑器,它支持多种编程语言,具有很多优良的特性。有众多的系统管理员和软件开发者使用emacs。 语法 e…