您的位置:首页 > 编程语言 > C#

C#基础|值类型和引用类型以及传参问题

2014-01-21 17:15 316 查看
为了明白什么是值类型和引用类型,先引入你两个概念。堆内存与栈内存

堆内存与栈内存

由于咱的描述能力有限,就不对其下定义了,来看看两者的作用。

共同点:
都是用来存放数据的

不同点:
堆内存:堆允许程序在运行时动态的申请某个大小的内存空间,用于存放对象的实例。换句话说,堆用于存放由new创建的对象和数组。
栈内存:主要用来存储局部变量的值。局部变量包括各种基本类型的变量,像int,char等,还包括对象的引用变量。

值类型和引用类型

有如下代码:
int n = 1;
Person p = new Person();
根据上面对堆内存和栈内存的描述可以得出,
变量n的值是存放在栈中的,它里面的内容就是1
变量p的值也是存放在栈中的,它里面的内容却是一个地址。这个地址正是Person的实例在堆中的地址。
如下图



把像n一样的变量类型称为值类型。
把像p一样的变量类型称为引用类型。

按值传递与按引用传递

函数传递变量有两种方式,按值传递和按引用传递,默认是按值传递,若要按引用传递要加上关键字ref.
像这样fun(ref int i);。
按值传递,传递的是该变量在栈中的值。
按引用传递,传递的是该变量在栈中的地址。

上面解释那么多都是为了看懂代码,下面是代码。
现有如下代码:
//主函数中的代码:
Person p1 = new Person();

Person p2 = new Person();

p1.Name = "icez1";
p2.Name = "icez2";
fun(p1, p2);
Console.WriteLine("{0},{1}", p1.name, p2.name);

//函数代码
void fun(Person _p1, ref Person _p2)
{
Person _p3 = new Person();
_p3.Nmae = "icez3";
_p1 = _p3;
_p2 = _p3;
}

运行结果:
icez1,icez3;

结束语

写这篇随笔的目的是出于锻炼自己的表达能力和思维逻辑能力的,若给你后面的学习带来误解请谅解。

2014/1/18 18:00
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐