ref以及传值传址的理解
public class MyClass{ public int Id { get; set; } } static void Invoke1(MyClass myClass)
{
myClass.Id = ;
} static void Invoke2(MyClass myClass)
{
myClass = new MyClass { Id = };
} var myClass = new MyClass { Id = };//原始值100
Invoke1(myClass);
Console.WriteLine(myClass.Id); //100变为0
Invoke2(myClass);
Console.WriteLine(myClass.Id); //依然是0
下面换一下将引用类型的参数加上ref关键字
public class MyClass{ public int Id { get; set; } } static void Invoke1(MyClass myClass)
{
myClass.Id = ;
}
static void Invoke2(ref MyClass myClass)
{
myClass = new MyClass { Id = };
} var myClass = new MyClass { Id = };//原始值100
Invoke1(myClass);
Console.WriteLine(myClass.Id); //100变为0
Invoke2(ref myClass);
Console.WriteLine(myClass.Id); //0变为50
- 引用类型的参数,函数中的改变不一定会影响原来的参数
- 即使是引用类型,加上ref关键字以后也可能产生不一样的结果
传过去的都是栈的副本:新的栈地址(栈的地址有改变) + 值副本(完全不变)
那么引用类型和值类型的参数传参行为是有区别的,区别在这里:
- 对于值类型:值副本就是原来的值
- 对于引用类型:值副本就是原来的堆栈地址
PS: 值类型栈上保存的值,引用类型栈上保存的托管堆的地址,真正的值在托管堆上
值类型传参对原参数无影响:栈地址和栈上的值都是副本,当然没影响
引用类型为什么有影响(不是所有情况都有影响):传过去的堆栈地址和原来的堆栈地址是同一个地址,引用类型数据在堆栈,所以操作是针对的同一个堆栈操作,堆栈值变了,原参数引用的也是这个堆栈,当然值也跟着变化。但是如果这种操作不是操作堆栈则不会影响以前的数据(比如把栈地址副本指向一个新的堆栈地址),
myClass = new MyClass { Id = 50 };
,这种操作是在堆栈上重新分配地址,然后把堆栈地址赋值给新栈副本,也就是副本栈的值不是原来的堆栈地址了,而是新的堆栈地址,那么这种改变对于原来的栈地址是没有任何影响的。
正常传参过程中值类型和引用类型内存示意图:

那么ref关键字到底是有什么作用?
ref以及传值传址的理解的更多相关文章
- [SAP ABAP开发技术总结]Form(subroutine)、Function参数传值传址
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- intent传值传对象跳转
intent传值传对象跳转 1.传值 //原activity中存入一个字段 intent = new Intent(From.this, To.class); intent.putExtra(&quo ...
- 关于c#中”ref”和”out”关键字的一些理解
一. 综述(本文内容大部分来自网络,经本人整理而成,仅供学习参考,不免理解错误,欢迎批评指正) 在c#中,方法的参数传递有四种类型: (1) 传值参数(by value) 传值参数无需额外的修饰符.传 ...
- 使用泛型元组替代out与ref形式传参
我们在开发的时候,都会常常遇到一个问题,如何为逻辑上返回多个对象设计方法签名.通常我们会想到使用out或ref修饰参数,或者麻烦些自己设定一个类型内部包含多个Object类型属性来接收多个返回值.这两 ...
- C#传真传址 结构体
1.传真 传址 namespace 传值_传址 { class Program { //格式1:无参无返 public void LeiJia() { Console.Write("请输入 ...
- 浅谈对java中传参问题的理解
之前用的c/c++比较多,在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.在网上找了找,按我之前的理解,java中传 ...
- react组件传值传方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 简谈Java传值传引用
本随笔旨在强化理解传值与传引用 如下代码的运行结果 其中i没有改变,s也没有改变. 但model中的值均改变了. i :100s :hellomodel :testchangemodel2 :ch ...
- HTTP协议GET方法传参最大长度理解误区
结论 HTTP 协议未规定GET和POST的长度 GET的最大长度是因为浏览器和WEB服务器显示了URI的长度 不同浏览器和WEB服务器,限制的最大长度不同 若要支持IE,则最大长度为2083 byt ...
随机推荐
- 我的第一个Maven工程
橘子松今天学了下maven 跑了个demo 其中也发现一些问题 并解决了 环境搭建 开始新建会有红叉. 在pom.xml里加入从你的本地仓库加入servlet-api.jar 如果没有 http:// ...
- 利用binarySearch实现抽奖计算逻辑
前言 我们平时抽奖总感觉想抽到最高的奖那么难,哈哈当然不会那么容易啦,正巧写了个抽奖的功能,趁着有时间把抽奖的功能实现整理一下,我们要抽奖首先要定义一个奖品的实体类,这个实体类中包含奖品的基本信息,比 ...
- Qt-绘图
1 简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=37 参考文档:<Qt教程.docx> 本文简单介绍Qt的绘图与绘图设备. ...
- HTML条件注释_关于IE条件注释
普通的HTML注释形式是 <!-- 注释 --> 而IE5~IE9这5个版本的IE浏览器还另外支持一种特殊的if条件注释(感觉有点类似模板渲染时的语法结构) <!--[if IE]& ...
- 前端同学经常忽视的一个 JavaScript 面试题
题目 function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = funct ...
- 帝国の狂欢(种树)(可撤销DP)
题目描述 马上就要开学了!!! 为了给回家的童鞋们接风洗尘,HZOI帝国的老大决定举办一场狂欢舞会. 然而HZOI帝国头顶上的HZ大帝国十分小气,并不愿意给同学们腾出太多的地方.所以留给同学们开par ...
- BUUCTF-BJD(更新V1.0)
CTF-Day1 (PS:第一次写博客,就是想记录自己的一一步一步) Misc: 问卷调查 | SOLVED |题最简单的misc-y1ng | SOLVED |Real_EasyBaBa | SOL ...
- js返回上一页并刷新思路
在网上找了很多办法,比如window.history.go(-1):window.history.go(0): 试了下根本没用(不知道是不是我哪里写错了),想着在上一个页面写一个关闭页面并刷新的方法, ...
- day11 文件操作(上)
目录 一.什么是文件 二.为何要用文件 三.如何使用文件 3.1文件操作的基本流程 3.2资源回收with上下文管理 3.3指定操作文本的字符编码 四.文件的操作模式 4.1控制文件读写操作的模式(t ...
- android手机的微信H5弹出的软键盘挡住了文本框,如何解决?
window.addEventListener("resize", function () { if (document.activeElement.tagName == &quo ...