c#中的引用传递疑问

coolmanlei 2009-04-21 10:43:15
之前学过java,对比c#中引用传递有些疑问,对于引用类型使用不使用ref,带来的影响
一下是学习代码
static void SendAPersonByReference(ref Person p)
{
p.personAge = 555;
p = new Person("Nikki",999);

}

static void SendAPersonByValue(Person p)
{
p.personAge = 99;
p = new Person("Nikki",99);
}
...全文
82 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
vrhero 2009-04-21
  • 打赏
  • 举报
回复
另外在.NET和Java中,引用不是对象的地址那么简单...虽然其本质是内存地址也可以作为内存地址去理解,但是引用比内存地址复杂得多...不能简单地将C/C++中的地址概念套在引用上面去理解...
jieon 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 vrhero 的回复:]
只不过引用传递的是对象的地址而已啊?
--------------
引用类型对象传递的是对象的地址的副本...一定要把 引用传递 和 引用类型对象传递 分清楚...
[/Quote]

UP
vrhero 2009-04-21
  • 打赏
  • 举报
回复
只不过引用传递的是对象的地址而已啊?
--------------
引用类型对象传递的是对象的地址的副本...一定要把 引用传递 和 引用类型对象传递 分清楚...
coolmanlei 2009-04-21
  • 打赏
  • 举报
回复
请教楼上哥哥,你说java没有引用传递,我想问的是,不管是java还是c#传递不都是值传递吗?只不过引用传递的是对象的地址而已啊?
vrhero 2009-04-21
  • 打赏
  • 举报
回复
这个问题是新手(包括很多老手)最容易混淆的地方之一...

在.NET和Java中引用类型都是值传递,传递的都是引用的副本...所以引用本身不可改变,但是引用指向的数据可能被改变...在C#中只有加ref或out参数才是按引用传递才可以改变引用本身,而Java则没有按引用传递...

去看看这个帖子...
http://topic.csdn.net/u/20090403/21/324eb54a-a54a-4cd5-a6ed-23644b9eb2ab.html
feifeiyiwen 2009-04-21
  • 打赏
  • 举报
回复
up
阿非 2009-04-21
  • 打赏
  • 举报
回复
C# 和 Java 都是值传递,只是C# 中 有ref 和out 参数,在应用这两个参数时 和Java 有所不同
阿非 2009-04-21
  • 打赏
  • 举报
回复
C# 里 除了传参时指明ref,其余全是值传递 当参数是引用类型时也是,只是传的是引用类型的实际内容存贮位置的地址
Garnett_KG 2009-04-21
  • 打赏
  • 举报
回复
对於引用类型,加不加ref,被调用的方法内都可以改变该引用类型对像的值.

如果加了ref,则还可以变更引用变量的值.

static void SendAPersonByReference(ref Person p)
{
p.personAge = 555; //改变p指向的对象上的personAge 值
p = new Person("Nikki",999); //重新new一个Person,给p. 此时p之前指向的对象在未来某个时刻将会被垃圾回收

}
coolmanlei 2009-04-21
  • 打赏
  • 举报
回复
对于这个例子来说,引用类型作为函数参数传递时,如果不加ref只能修改的是类成员personAge的数值,但不能将P指向新的用户对象是吗?因为java中不存在ref这样的关键字,所以比较晕
wonture 2009-04-21
  • 打赏
  • 举报
回复
加ref表示引用传递,也就是说,传给方法的是对象的内存地址。如果方法里面改变了对象的值,那么这个对象的值就绝对改变了。
如果没用ref,则表示值传递,传给方法的是对象的值。如果方法里面改变了对象的值,相对于外部方法,其实这个对象的值是不变的。
zgke 2009-04-21
  • 打赏
  • 举报
回复
static void SendAPersonByReference(ref Person p)
{
p.personAge = 555;
p = new Person("Nikki",999);

}

p在执行完毕后是 new Person("Nikki",999);

static void SendAPersonByValue(Person p)
{
p.personAge = 99;
p = new Person("Nikki",99);
}
执行完毕后还是p

如果不加ref 不能改变引用 但能改变引用里的内容.

110,534

社区成员

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

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

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