C# 值传递和引用传递
来源:互联网 发布:linux 查看自启动服务 编辑:程序博客网 时间:2024/05/23 01:16
一、首先介绍一下值类型和引用类型:
值类型:int ,double,char,decimal,bool,enum,struct类型都是值类型。
引用类型:string ,数组,自定义类,集合,object,接口都是引用类型。
二、两者在内存的区别:值类型存在堆上,引用类型存在栈上。
三、值传递和引用传递。
static void Main(string[] args) { int n1 = 10; int n2 = n1; n2 = 20; Console.WriteLine(n1); Console.WriteLine(n2); Console.ReadKey(); }
不难得到结论,输出是:
备注:值类型传递的时候,传的是他的本身。
(把n1的值复制了一下给了n2,当执行“n2 = 20”的时候,把20赋值给了n2。)
下图是原理的解释,这个应该不难:
好的,我们看引用类型传递(自定义类)
class Program { static void Main(string[] args) { Person p1 = new Person(); p1.Name = "张三"; Person p2 = p1; p2.Name = "李四"; Console.WriteLine(p1.Name); Console.WriteLine(p2.Name); Console.ReadKey(); } } public class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } }
结果却是:
按照一开始的想法,应该是 张三、李四才对,那么这就是引用类型的传递。我们逐步解释。
备注:引用类型在复制的时候,传递的是对这个对象的引用或者地址。
引用类型复制的时候,既然复制的是对象的引用或者地址,那么一开始实例化的一个p1,他在栈上的地址比如说100001,指向堆上的 new Person(),然后实例化了一个p2,把p1复制给了p2,我们说引用类型复制的时候,复制的是对象的引用或者地址,那么p2和p1在栈上的地址是一样的,(但还是开辟了两个栈地址),他们两个都是指向堆的同一个空间。
所以p1和p2只要有一个改变,那么他们两个都会随之改变!
画图解释:
例子:
class Program { static void Main(string[] args) { Person p = new Person(); p.Name = "张三"; Test(p); Console.WriteLine(p.Name); Console.ReadKey(); } public static void Test(Person pp) { Person p = pp; p.Name = "李四"; } }
输出的 是 李四
特殊点:引用类型中的 String
static void Main(string[] args) { string s1 = "张三"; string s2 = s1; s2 = "李四"; Console.WriteLine(s1); Console.WriteLine(s2); Console.ReadKey(); }
这个按照上面的介绍,引用类型传递的时候,两个之中的任意一个改变,那么就会全部改变,但是,输出却是这样的:
这是因为字符串的不可变性!String就是引用类型之中的特例,面试的时候很多面试官会挖坑让你跳。
谢谢浏览,如有不妥之处,请提出批评,一定及时修改,见谅。
- c#引用传递和值传递
- C#中的引用传递和值传递
- C#中的引用传递和值传递
- C# 值传递和引用传递
- C# 值传递和引用传递详解
- C#之值传递和引用传递
- C#参数传递:值传递和引用传递
- 值传递和引用传递
- 值传递和引用传递
- 值传递和引用传递
- 值传递和引用传递
- 引用传递和值传递
- 值传递和引用传递
- 值传递和引用传递
- 值传递和引用传递
- 值传递和引用传递
- 值传递和引用传递
- 值传递和引用传递
- UVA 12506 Shortest Names
- 127 C语言文件的随机读写
- 排序算法之快速排序的理解与实现
- POJ1149:PIGS(最大流)
- linux内核升级
- C# 值传递和引用传递
- 欢迎使用CSDN-markdown编辑器
- 大明想跟你聊聊Solr6.x
- 美团点评面经
- adb shell 中的 dumpsys 命令调用过程 探究 (16/04/05)
- Visual Studio2013 开发环境搭建
- paulzhou的数学?TAT? 【二分打表找规律】
- 集合中hashcode()和equalse()、Comparable、队列
- python--open/文件操作