C#的值传递和引用传递问题

Woodz_Monday 2010-02-05 06:06:46
C#新手,能不能用最通俗的方法帮我解释一下C#的这两种传递,以及这两种传递的用途及用法?
...全文
417 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zishanyan 2010-02-05
  • 打赏
  • 举报
回复
打个比方,int a=5;
在进行值传递的时候,a 本身并没有参与运算,参与运算的是数值5,那么在运算中无论对5怎么加工,a 还是没变,依然是a=5;

在进行引用传递的时候,a本身参与到了运算中,所以在运算中对a也产生了影响,a本身的值也会发生改变
gghlkk 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 diegod 的回复:]
一个是值传,一个是址传
把变量比作盒子,把变量存储的数值比作苹果。

苹果从一方传给另一方
如果是值传,那么对方得到了一个经过复制的一样的苹果,放到了自己的盒子里,最终他只能修改自己的盒子里装的苹果,这与你无关。

如果是址传,对方就比较霸道了,把苹果跟盒子都拿走了,不值得到了苹果,还可以修改你的盒子。
[/Quote]

盒子也是复制的 苹果是真实的
nival 2010-02-05
  • 打赏
  • 举报
回复
学习ing
wjp_116 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 diegod 的回复:]
一个是值传,一个是址传
把变量比作盒子,把变量存储的数值比作苹果。

苹果从一方传给另一方
如果是值传,那么对方得到了一个经过复制的一样的苹果,放到了自己的盒子里,最终他只能修改自己的盒子里装的苹果,这与你无关。

如果是址传,对方就比较霸道了,把苹果跟盒子都拿走了,不值得到了苹果,还可以修改你的盒子。
[/Quote]
通俗易懂,对初学者很合适,以后的再慢慢体会
littleJunes 2010-02-05
  • 打赏
  • 举报
回复
传值和传址就是操作的对象的区别
传值操作的是复制品,对原数据无影响
传址操作的就是原数据
diegod 2010-02-05
  • 打赏
  • 举报
回复
一个是值传,一个是址传
把变量比作盒子,把变量存储的数值比作苹果。

苹果从一方传给另一方
如果是值传,那么对方得到了一个经过复制的一样的苹果,放到了自己的盒子里,最终他只能修改自己的盒子里装的苹果,这与你无关。

如果是址传,对方就比较霸道了,把苹果跟盒子都拿走了,不值得到了苹果,还可以修改你的盒子。
liushengmz 2010-02-05
  • 打赏
  • 举报
回复
这个跟内存分配有关。通俗的讲,

值类型传的就是值,引用类型传的是地址。

这只是表面说法。深层一点就是,值类型一旦声明,

就会以默认值(赋了初始值就以初始值)保存在变量栈中,

函数调用的时候直接就是去栈中取对应的数据。

而引用类型,有一点不一样,就是:引用类型一旦声明,

就保存在变量栈中,但是它是没有默认值的,它同时有一个指针

指向另外一块内存中,如果只是声明而没有赋值,那么它的指针指向为空,

如果是赋了值,那么它的指针指向了保存了那个值的地址。

这里只是浅显的说了一下值类型和引用类型在内存里面的区别,

真正要去搞懂是需要比较多的底层知识。

如果对于普通的程序员来说记住它表层的就行了:

值类型传的是值,引用类型传的是地址!
guyehanxinlei 2010-02-05
  • 打赏
  • 举报
回复
一个传值,一个传址!
phoeni_xin 2010-02-05
  • 打赏
  • 举报
回复
是否
ctwei86 2010-02-05
  • 打赏
  • 举报
回复
值传递(不带ref或者out的):顾名思义,传递的是值,该传递会将值复制一个传递个形参。
引用传递(带ref或者out的):同样,传递的是引用,在C和C++中叫做指针,其实就是地址,该传递不会复制一个值,只是把自己的地址传递给形参。
二者的区别是值传递参数的值不会被带回,而引用传递参数的值会改变。
这样说可能会有一个问题,就是当我传递一个引用类型的参数的时候值也将被带回,这就不对了呀!
其实不然,之所以出现这种情况是因为引用类型的变量自己本身就是一个引用,因此在传递的时候传的就是一个引用,即地址,这样当值发生变化的时候值也会被带回。
这么看那对于引用类型而言加ref和不加就没有区别了吗?
答案是否定的。回到最初,值传递会将自己的值复制一个传递给形参,这样的话,实参和形参只是引用相同,方法中将形参重新初始化的时候(比如string类型),参数的值并不被带回。
但是引用传递不一样了,它是将自己的地址传递给形参,这样的话实参和形参公用一个地址,当你在方法内无论你如果初始化形参,其值始终都会别带回。
例子如下。

class Student
{
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
private int age;

public int Age
{
get { return age; }
set { age = value; }
}
}
class Program
{
static void Main(string[] args)
{
Student stu = new Student();
stu.Name = "Chengtao";
stu.Age = 25;
AddAge(stu);
Student stu1 = new Student();
stu1.Name = "Hongwei";
stu1.Age = 26;
SubAge(ref stu1);
Console.WriteLine(stu.Age);
Console.WriteLine(stu1.Age);

Console.Read();
}
private static void AddAge(Student stu)
{
stu = new Student();
stu.Age = 20;
}
private static void SubAge(ref Student stu)
{
stu = new Student();
stu.Age = 30;
}
}

输出
25
30
说的有点繁,希望对楼主有用吧!
soaringbird 2010-02-05
  • 打赏
  • 举报
回复
值类型:
按值传递:对参数及其成员(如果有)的赋值不能反映到调用者
按引用传递(ref/out):对参数的赋值将反映到调用者

引用类型:
按值传递:对参数的赋值不能反映到调用者,但是给其成员(如果有)赋值并反映到调用者
按引用传递(ref/out):对参数的赋值将反映到调用者
soaringbird 2010-02-05
  • 打赏
  • 举报
回复
1楼给的那篇博文忽略吧,很多谬误
Dogfish 2010-02-05
  • 打赏
  • 举报
回复
把别人的东西贴一下。不知道是否楼主要的。
http://blog.csdn.net/AppleDotnet/archive/2005/11/15/529943.aspx

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧