到底传递的是值还是引用?

rommayer 2009-06-29 12:15:24
public class A
{
public int i;

}

public static P
{
void main()
{
A a=new A();
a.i=1;
M(a);

consolne.Write(a.i);
}
public M(A a)
{
a.i=100;
}
}
程序输出的结果是:100

请问这里的 M(a);传递的是值,还是引用。。。?不是说函数参数如果不显式的使用 ref,默认是值传递吗?为什么这里输出的是100呢???
。。。。。。。。
。。。。。。。。
。。。。。。。。
...全文
81 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
evaa006 2009-06-30
  • 打赏
  • 举报
回复
UP
嘻嘻哈哈精怪 2009-06-30
  • 打赏
  • 举报
回复
引用和指针 并无太大区别。
CLR内部 而言,引用实际上仍然是一个指针,指向一块 对象所占的内存。
由于这块内存 和 在非托管 C++中并不一样,是有可能会变化的,所以把这个内存地址暴露给用户是危险的,所以就用引用来代替,以防止用户作出错误的操作

在非托管C++中,一个对象可以建立在栈上面,而C#中的对象全部建立在堆里面(托管堆)。

youHavesi 2009-06-30
  • 打赏
  • 举报
回复
结构、一般类型(int、float、byte)是在内存中是序列的,按传值的(因为是序列的,开发工具知道如何复制副本)。

类、数组是在内存中序列是离散的,按引用的(因为是离散的,开发工具不知道如何复制副本)。

传值类型想按引用的加ref
Change(ref Rectangle rect)//引用
Change(Rectangle rect)//传值,rect是副本

引用的可加可不加ref
rommayer 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 hztltgg 的回复:]
类型有值类型和引用类型,参数传递方式有值方式和引用方式,所以说有四种情况,而楼主因为是两种,弄重叠了

值方式传递值类型,内部变化看不见,很简单
值方式传递引用类型,也是平时用的最多的一种,传递过去的类型,里面的字段,属性都是可以变化的,但是这个值不能重新指向一个new出来的对象
引用方式传递值类型,那内部变化外部也看的见,这个平时也会用到
引用方式传递引用类型,这个会比较混乱,一般不会这样用,就是你传递给他一个对象,可以执行了以后返回另外一个对象,也许复制,克隆一类的功能会用到。



[/Quote]

说得很有道理。。。
sadikaqy 2009-06-30
  • 打赏
  • 举报
回复
有ref就是引用传递,没有就是值传递
gaozhigang 2009-06-30
  • 打赏
  • 举报
回复
引用传参
qiduo221 2009-06-30
  • 打赏
  • 举报
回复
应用类型吧
Hide1984 2009-06-30
  • 打赏
  • 举报
回复
Ref关键字传递栈地址
引用类型传递的是堆地址
如果你把ref 使用到引用类型上那么就会把引用类型的地址传递过去
而不是把引用类型应用的堆地址传递过去




echoxue 2009-06-30
  • 打赏
  • 举报
回复
xuexi
phommy 2009-06-30
  • 打赏
  • 举报
回复
你是没加ref,可人家a也没变啊-_- 变的只是a.i,没人向你保证过类的成员变量也不变的-_-
cc_net 2009-06-29
  • 打赏
  • 举报
回复
A a=new A();
a.i=1;
M(a);
传的是值,变量a分配在栈上,对象A分配在堆上。a中存放的是对象A的地址
M(a)传递是传递变量a的值,也就是地址

如果M(ref a)这样传递的是引用,是传递的变量a的地址
kkun_3yue3 2009-06-29
  • 打赏
  • 举报
回复
引用...


所有继承自object的都是引用...(new,Colone关键字修饰过除外)
ginni215 2009-06-29
  • 打赏
  • 举报
回复
A都是你自己定义的类型,当然是引用了~~
我姓区不姓区 2009-06-29
  • 打赏
  • 举报
回复
坐看有多少人误导
CsToD 2009-06-29
  • 打赏
  • 举报
回复
当然传的是值的
你的疑问在于,你没有弄清楚值类型与引用类型的区别
引用类型包括两部分——引用和对象
其中引用是4个字节的指令,在栈上分配内存空间;而对象在堆上分配内存空间。

A a=new A();
a.i=1;
M(a);
在这里,a就是引用,new A()才是对象。
值传递的意思在于,方法调用时,生成了一个a的副本(注意,是引用的副本,而非对象的副本)
而这个副本所指向的对象跟原来的a是同样的,所以修改一个,另一个也发生了变化。

你也许会有这样的疑问:那引用类型按值传递和按引用传递有什么区别呢?
这当然是有区别的,请看代码:
public M(A a)
{
a=new A();
a.i=100;
}
public M(ref A a)
{
a=new A();
a.i=100;
}

可以看到,如果在方法内对a重新new一个对象,那么按值传递中,修改其中一个,另一个并不会变化;
而如果按引用传递,则同步变化。
shui8iuhs 2009-06-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dancingbit 的回复:]
a的类型是A,而A是一个类,也即是引用类型,对于引用类型来说,传一个值过去,实际上还是引用。
[/Quote]

同意。
Xuon 2009-06-29
  • 打赏
  • 举报
回复
引用类型 写错了
dancingbit 2009-06-29
  • 打赏
  • 举报
回复
a的类型是A,而A是一个类,也即是引用类型,对于引用类型来说,传一个值过去,实际上还是引用。
Xuon 2009-06-29
  • 打赏
  • 举报
回复
a是一个要用类型啊。
看这句:
A a=new A(); 
sl2161 2009-06-29
  • 打赏
  • 举报
回复
类是传递的引用

你直接把M改成(int a),结果就不一样了
加载更多回复(13)

110,538

社区成员

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

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

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