C# 深度解说值传参和引用传参的原理
来源:互联网 发布:理财软件对比分析 编辑:程序博客网 时间:2024/04/30 11:18
值传和址传经典解说。
例子一
using System;
class Element
{
public int Number=10;
}
class Test
{
static void Change(Element s)
{
s.Number=100;
}
static void Main()
{
Element e=new Element();
Console.WriteLine(e.Number);
Change(e);
Console.WriteLine(e.Number);
}
}
程序经编译后执行输出:
10
100
例子二
using System;
class Element
{
public int Number=10;
}
class Test
{
static void Change(Element s)
{
Element r=new Element();
r.Number=100;
s=r;
}
static void Main()
{
Element e=new Element();
Console.WriteLine(e.Number);
Change(e);
Console.WriteLine(e.Number);
}
}
程序经编译后执行输出:
10
10
看到上面两个例子,大家心里都有一个疑问那就是为什么第一个例子输出了100 而第二个例子输出的还是10。那就让我给大家解答解答,
我们先了解一下值传和引用传的真正原理:
在经常情况下大家都会认为,值类型的参数就是传值,引用类型的参数就是。其实不是这样的。真正的原理是这样,无论参数是什么类型,值传是参数前面不加ref或out,而引用传参是在参数面前加上ref或out。
那么到底什么是真正的值传和引用传呢,例如上边的代码两个例子其实都是值传。当new一个e的对象时在线程堆栈里分配了一块内存e(实参)保存e对象的在托管堆的内存地址。而在调用Change(e);的时候,因为没有ref或out修饰在线程堆栈又分配了一块内存空间e(形参)也就就是e的一个拷贝内存块,两个e保存的都是e对象的地址,都指向同一个对象。当在参数前面没有ref或out时,启用的是e形参也就是拷贝的内存。在方法change里面其实用的是形参,在第二例子里,当你给s复制时,其实是把r复制给形参e并没有复制给实参e,所以当方法执行之后,实参的值根本就没有改变。而我们再main方法里用的e实参,所以Number的值没有改变。
如果想在第二例子里调用change后输出100,那只有一个办法在方法声明的时候用ref或out来修饰参数,而这时候传就不是托管堆的地址了传的是实参e的内存地址。
那么第一个例子为什么Number的值会变呢?因为在实参和形参存的都是同一个内存地址,而对象又都存在托管堆内存中,无论你是通过形参还是实参都是修改这个内存中属性的值,所以最后在第一个例子中Number变了。
- C# 深度解说值传参和引用传参的原理
- C# 深度解说值传参和引用传参的原理
- C#中值类型和引用类型的区别深度分析
- C#中值类型和引用类型的区别深度分析
- JVM工作原理和特点的解说
- C#基础原理拾遗——引用类型的值传递和引用传递
- 指向指针的引用的实例解说
- 工程师解说raid6结构和原理
- C# Params,ref,out传参关键字解说
- C#中ref out和params 即传值\传引用和传参的区别
- 引用计数的原理和实例
- block块的原理 和循环引用
- 引用计数的原理和实例
- C# ref与out 引用和传值的区别
- 解说Hibernate的工作原理实例
- 解说Hibernate的工作原理实例
- 简单易懂的金融"杠杆原理"解说
- 简单易懂的金融"杠杆原理"解说
- http streaming缓冲buffer更新进度的处理流程
- org.apache.solr.common.SolrException: Request-URI Too Large
- To do list
- sql中如何将字符型转化为整型,如将123.00转化为123
- Oracle 用户和角色
- C# 深度解说值传参和引用传参的原理
- java.net.NoRouteToHostException: No route to host: no further information
- 庄吉IES物料信息明细显示不全的解决方法
- 黑马笔记-多线程代码
- C# 中SqlParameter类的使用方法小结
- Android与PC的socket通信
- Linux内存管理之kmalloc 与 __get_free_page()
- 测试用例设计心得
- test1