C#方法中值传递的问题?

cjdxhc 2009-12-14 11:33:06

class Program
{
private string a;

private int b;

static void Main(string[] args)
{
Program p1 = new Program();
p1.a = "p1a";
p1.b = 1;
Program p2 = new Program();
p2.a = "p2a";
p2.b = 2;
new Program().ChangeA(p1, p2);
Console.WriteLine(p1.a + p1.b);

new Program().ChangeB(p1, p2);
Console.WriteLine(p1.a + p1.b);
}

private void ChangeA(Program p1, Program p2)
{
p1 = p2;
}

private void ChangeB(Program p1, Program p2)
{
p1.a = p2.a;
p1.b = p2.b;
}


无论参数是基本类型还是值类型,都不会改变原来的值,这是为什么?
调用ChangeB方法又可以改变对象中属性的值,这又是为什么?
...全文
301 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
没有访问权限 2009-12-14
  • 打赏
  • 举报
回复
数据之巅 2009-12-14
  • 打赏
  • 举报
回复
传入的参数为引用类型时,可以改变;值类型需要用到ref out。。。。
peter20091001 2009-12-14
  • 打赏
  • 举报
回复
参数类型不是值类型时,是引用传递,相当于C语言中的指针。
cjdxhc 2009-12-14
  • 打赏
  • 举报
回复
第一点明白了!
那么第二个方法
ChangeB(p1, p2);

这个为什么可以改变?
mohugomohu 2009-12-14
  • 打赏
  • 举报
回复
看看c语言的指针!!!
vrhero 2009-12-14
  • 打赏
  • 举报
回复
把“按值传递”、“按引用传递”、“传递值类型参数”、“传递引用类型参数”分清楚...这四句话是四个完全不同的意思...
Alden 2009-12-14
  • 打赏
  • 举报
回复
new Program().ChangeB(p1, p2);
只是一个进行数据交换的方法而已
vrhero 2009-12-14
  • 打赏
  • 举报
回复
问过无数次的问题...在C#中,未经ref或out关键字声明,任何参数都是“按值传递”与参数类型无关...

去看MSDN...
liherun 2009-12-14
  • 打赏
  • 举报
回复
。。。。
Alden 2009-12-14
  • 打赏
  • 举报
回复
new Program().ChangeA(p1, p2);
创建了一个新的实例,而不是在原来的实例上运行的
浪子-无悔 2009-12-14
  • 打赏
  • 举报
回复
沙发!!!
卧_槽 2009-12-14
  • 打赏
  • 举报
回复
private void ChangeA(ref Program p1,ref Program p2)
{
p1 = p2;
}

private void ChangeB(ref Program p1,ref Program p2)
{
p1.a = p2.a;
p1.b = p2.b;
}
kugou123 2009-12-14
  • 打赏
  • 举报
回复
楼主参考下out,ref的用法
woshifou 2009-12-14
  • 打赏
  • 举报
回复
按值传递和按引用传递的问题。
jin20000 2009-12-14
  • 打赏
  • 举报
回复
额,我该说什么好呢?
ZBXX631 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 vrhero 的回复:]
把“按值传递”、“按引用传递”、“传递值类型参数”、“传递引用类型参数”分清楚...这四句话是四个完全不同的意思...
[/Quote]
按这个可以解释这两个方法:
这两个方法都是"按值传递",同时也是"传递引用类型参数",所以p1=p2无效,不能改变P1的指针。
但p1.a = p2.a;有效,没改变指针,但可以改变其中的属性,改变的是P1指针空间中的属性值。
qldsrx 2009-12-14
  • 打赏
  • 举报
回复
ref其实用的不多,一般使用类,对属性赋值传递即可,因为ref的参数无法全局保持,只能出现在函数中。不过替代方案是用static静态变量,静态的变量性质等同于ref传递,无论是值类型还是引用类型。
RogerXi 2009-12-14
  • 打赏
  • 举报
回复
关注
vrhero 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cjdxhc 的回复:]
引用 10 楼 asxinyu_usst 的回复:
传入的参数为引用类型时,可以改变;值类型需要用到ref out。。。。


你可以自己运行下!是不改变的!
[/Quote]
当然不会改变...这个问题反复出现还总是有人搞不清楚基本上就是指针害的,在.NET中一定要忘记C/C++的指针!.NET中的引用和C/C++指针虽然相似但却是完全不同的概念,.NET中的引用是远比指针更复杂的结构...
[Quote=引用 MSDN:]
引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。若要这样做,应使用 ref 或 out 关键字传递参数。[/Quote]
多看看MSDN...
传递参数(C# 编程指南)
qldsrx 2009-12-14
  • 打赏
  • 举报
回复
如果传入的是引用类型,内部的属性是可以改变的,但引用对象本身无法改变。如果传入的是值类型,对象本身及内部属性都无法改变,常见的比如结构体。
如果使用ref关键字,则无论是引用类型还是值类型,其内部属性及对象本身都可以改变。
加载更多回复(1)

111,120

社区成员

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

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

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