关于 C# 引用参数和值参数

news2024/12/25 11:22:56

关于 C# 引用参数和值参数

C# 数据类型分为值类型引用类型,两者的区别在于值类型的数据存储在中,而引用类型的数据存储在中,但是栈中会存放指向存储数据的堆的位置

传递参数时,传递的是数据栈中的值,实参将数据栈中的值传递给形参,形参将实参传递来的数据栈中值复制,所以在引用类型作为参数时,被复制的只是存储数据堆的位置,以至于在形参中修改引用类型的数据,会影响到实参中引用类型的数据值,因为两者在数据栈中的值都是指向堆的同一位置。

class A{ // 引用类型
    public int valA;
    public A(int valA=0){
        this.valA = valA;
    }
}
int b; // 值类型
-------------
void fun(A a,int b){
    a.valA = 10;
    b = 20;
    Console.WriteLine($"{a.valA},{b}"); //10,20
}

static void Main(){
    A a = new A();
    b = 0;
    Console.WriteLine($"{a.valA},{b}"); //0,0
    fun(a,b);
    Console.WriteLine($"{a.valA},{b}"); //10,0
}

在这里插入图片描述

如何将值类型参数转化为引用参数

引用参数

  1. 使用引用参数时,必须在声明和调用中都使用 ref 作为修饰符。
  2. 实参必须时变量,在作为实参前必须被赋值。
  3. 系统不会在栈上为形参分配内存,形参的参数名作为实参变量的别名,指向相同的内存位置。

示例

class program{
    static void func(ref int a2,ref int b2){
        a2 = 10;
        b2 = 20;
    }
    static void Main(){
        int a1 = -1;
        int b1 = -2;
        Console.WriteLine($"{a1},{b1}"); //-1,-2
        func(ref a1,ref b1);
        Console.WriteLine($"{a1},{b1}"); //10,20
    }
}

内存变化图

在这里插入图片描述

引用类型作为值参数

在方法内创建一个新对象并赋值给形参,切断新参与实参之间的关联,在方法调用结束后,新对象也不复存在。

示例

class myclass{
    public int val = 20;
}

class program{
    static void func(myclass a2){
        a2 = new myclass(); // 切断联系
        Console.WriteLine($"{a2.val}"); //20
        a2.val = 50;
        Console.WriteLine($"{a2.val}"); //50
    }
    static void Main(){
        myclass a1 = new myclass();
        Console.WriteLine($"{a1.val}"); //20
        func(a1);
        Console.WriteLine($"{a1.val}"); //20
    }
}

内存变化图

在这里插入图片描述

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

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

相关文章

高等数学——一元函数微分学

文章目录导数与微分概念几何意义连续、可导、可微之间的关系求导法则基本初等函数的导数公式有理运算法则复合函数求导法奇偶性和周期性隐函数求导反函数求导参数方程求导对数求导法高阶导数概念常用的高阶导数公式微分中值定理和导数的应用微分中值定理导数的应用函数的单调性…

巾帼绽芬芳 一起向未来(下篇)

编者按:为了隆重纪念纪念“三八”国际妇女节113周年,快来与你全方位、多层次分享交流“三八”国际妇女节的前世今生。分上篇(节日简介、节日发展和节日意义)、中篇(节日活动宗旨和世界各国庆祝方式)和下篇&…

Linux学习第二十节-NTP网络时间协议

1.概念 NTP(Network Time Protocol)网络时间协议基于UDP用于网络时间同步的协议,使网络中的计算机时钟同步到UTC(世界统一时间),再配合各个时区的偏移调整就能实现精准同步对时功能。 chrony是网络时间协议NTP的实现方式, Chron…

three.js 纹理贴图的使用

刚刚入门的小伙伴请先查看 three.js 基础认识与简单应用 本文章中的两个注意点,下面也有提到,分别是: 1、 vue项目中使用的贴图路径-->需要把 static文件夹 放到 public文件夹下,并使用 static 开头的绝对路径。 2、使用环境遮挡贴图时&a…

Air780E|阿里云|AT命令|物联网|三元组|鉴权|算法|密钥生成-阿里云物联网手动接入步骤

基础资料基于Air780E开发板:Air780E文档中心简介:AT开发探讨重点本系列主要探讨MQTT手动接入腾讯云物理网平台的基本操作及手动鉴权步骤、信息订阅及发布的基本原理。参考阅读:物联网模组AT命令接入云平台(1)-MQTT基本…

移动硬盘怎么恢复数据?怎么恢复硬盘删除的数据

移动硬盘可以随时插上或拔下,小巧而便于携带的硬盘存储器,以较高的速度与系统进行数据传输。由于其存储空间较大,性价比较高,存储和传输数据快速简便,是很多职场人士必备的外置设备之一。移动硬盘怎么恢复数据&#xf…

cuda代码高效策略--b站看课的笔记

1.1 高效公式 要么增大数据量,要么减少每个线程的内存(每个线程读取的数据量变少,每个线程的读取数据的速度变快(转变存储方式,对读取慢的地方做优化–合并全局内存)) 1.2 合并全局内存 一个线…

电子台账:模板制作之二——行过滤(垂直过滤)

1 简介大部分情况下,企业数据源表格中,只有部分行的数据可用于电子台账。例如,一共100行数据,我们只要取得其中20行即可。如果所有数据一股脑全部导入到台账中,再手工删除不需要的行,太麻烦了,有…

js变量和函数提升

1、变量提升 变量提升是JavaScript 中比较“奇怪”的现象,它允许在变量声明之前即被访问 (仅存在于var声明变量) 注意: 1.变量在未声明即被访问时会报语法错误 2.变量在var声明之前即被访问,变量的值为 undefined 3.let/const声明的变量不存在变量提升…

sqli-labs通关lesson36-40

1.lesson36 union select判断注入:为单引号注入?id1%df-- 查数据库:?id-1%df union select 1,2,database()-- 2.lesson-37 报错注入判断注入:为单引号注入通过下方判断password为单引号注入unamez&passwdg%df -- &submitSubmit查数…

神经网络之反向传播算法(自适应梯度算法Adagrad)

文章目录自适应梯度算法(Adagrad)1、算法原理2、算法实现2.1 训练过程2.2 测试过程及结果3、参考源码及数据集自适应梯度算法(Adagrad) 自适应梯度算法(Adaptive gradient algorithm,Adagrad)与…

惊!初中生也来卷了……

大家好,我是良许。 前两天在抖音直播的时候,突然来了一位不速之客…… 他自称是初中生,一开始我还有点不太相信,直到跟他连麦,听到他还略带一些稚嫩的声音,我才知道,他没有骗我…… 他说他想学…

Dynamic Movement Primitives (DMP) 学习

Dynamic Movement Primitives (DMP) 学习 【知乎】Dynamic Movement Primitives介绍及Python实现与UR5机械臂仿真 1. DMP的建模过程 链接:Dynamic Movement Primitives介绍及Python实现与UR5机械臂仿真 - 知乎 (zhihu.com) 沙漏大佬!!&am…

转行软件测试需要学习哪些知识点?来来来,都给你汇总在这里啦!

都说IT互联网行业吃香,那么如何才能高效转行,习得一技之长换取心仪offer? 一般来说,0基础小白想转行到软件测试行业,按照如下学习逻辑肯定是错不了的: 1.零基础小白入门篇(学前扫盲&#xff09…

ThinkBook15电脑开机后马上蓝屏不能使用怎么办?

ThinkBook15电脑开机后马上蓝屏不能使用怎么办?最近有用户使用的ThinkBook15电脑出现了开机之后屏幕蓝屏的情况。出现这个问题,是系统底层的故障,一般用户很难找出问题进行彻底解决。但是我们可以通过以下重做系统的方法来恢复电脑系统的使用…

阶段二11_面向对象高级_学生管理系统案例3

主要功能: 完成学生信息添加,修改和删除功能。 一.查看学生 思路: 图片:5_查看学生思路图.png 代码: StudentController[客服类中] //查找学生 private void findAllStudent() {//1.方法内部创建StudentService业…

Nacos 使用Postgresql数据库制作镜像

构建前提在 Nacos 2.2.0支持postgresql数据库基础上进行构建github地址:个人仓库编译打包源码mvn -Prelease-nacos clean package install -Dmaven.test.skiptrue若想跳过pmd和checkstyle检查请使用mvn -Prelease-nacos clean package install -Dmaven.test.skiptru…

Vue 3.0 组合式API 介绍 【Vue3 从零开始】

提示 在阅读文档之前,你应该已经熟悉了这两个 Vue 基础和创建组件。 在 Vue Mastery 上观看关于组合式 API 的免费视频。 通过创建 Vue 组件,我们可以将接口的可重复部分及其功能提取到可重用的代码段中。仅此一项就可以使我们的应用程序在可维护性和…

SAP ERP系统PP模块计划策略2050详解

SAP/ERP系统中面向订单生产的计划策略主要有20和50两个策略,这两个策略都是面向订单生产的计划策略,也是离散制造行业应用比较广泛的策略。它们之间最大差异就是在于20策略完全是由订单驱动,而50策略是预测加订单驱动,本文主要介绍…

【Leetcode 剑指Offer】第 14 天 搜索与回溯算法(中等)

文章目录剑指 Offer 12. 矩阵中的路径DFS剪枝面试题13. 机器人的运动范围剑指 Offer 12. 矩阵中的路径 典型矩阵搜索题 DFS剪枝 深度优先搜索: 可以理解为暴力法遍历矩阵中所有字符串可能性。DFS 通过递归,先朝一个方向搜到底,再回溯至上…