一个应该不难的问题,关于ref参数,可惜俺搞不清楚!!!

希偌 2003-03-13 10:39:29
下面这两个类运行之后的打印结果不同???何解
class Class1
{
class coordinate
{
public double x=0.0;
public double y=0.0;
}
[STAThread]
static void Main(string[] args)
{
coordinate loc=new coordinate();
loc.x=100;
loc.y=100;
PassCoordinateByValue(loc);
Console.WriteLine(loc.x+","+loc.y);
}

static void PassCoordinateByValue(coordinate c)
{
c=new coordinate();
c.x=22.22;
c.y=22.22;
}
}
------------------------------------------------------------------------
class Class1
{
class coordinate
{
public double x=0.0;
public double y=0.0;
}
[STAThread]
static void Main(string[] args)
{
coordinate loc=new coordinate();
loc.x=100;
loc.y=100;
PassCoordinateByValue(ref loc);
Console.WriteLine(loc.x+","+loc.y);
}

static void PassCoordinateByValue(ref coordinate c)
{
c=new coordinate();
c.x=22.22;
c.y=22.22;
}
}
...全文
44 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
timmy3310 2003-03-13
  • 打赏
  • 举报
回复
方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

第一个类中:
PassCoordinateByValue(loc);
这里传递了loc这个对象的引用给方法PassCoordinateByValue,在方法PassCoordinateByValue中用变量c接收了这个引用,紧接着,new了一个新的对象,把这个新对象的引用赋给c,这时候c就不再引用传进来的那个对象,所以对c的更改不能反映到外面。

第二个类中:
因为PassCoordinateByValue中的c声明为ref,按照ref关键字的定义,任何对ref类型变量的修改都会直接反映到这个变量中。
PassCoordinateByValue(ref loc)相当于(可以理解为)传递了loc这个变量的指针给PassCoordinateByValue方法,PassCoordinateByValue方法中用c这个变量(指针)接收了这个对象,当new一个对象,将这个对象的引用指向c的时候,这个时候,相当于修改了传递进来的这个指针的引用,所以调用这个方法的函数体的loc这个局部变量指向的对象也相应发生了变化;至于原来的那个对象,由于没有其他任何变量对它进行引用,已经被GC回收了。
希偌 2003-03-13
  • 打赏
  • 举报
回复
关键是这个内存地址是如何被分配的,在这个例子里?!?!
niwalker 2003-03-13
  • 打赏
  • 举报
回复
和和,把两个例子PassCoordinateByValue中的c=new coordinate();注释掉,结果应该是一样的。不管是ref还是没有ref. 然后你在想想为什么是这样。都3星级了,应该没问题吧?
xsp 2003-03-13
  • 打赏
  • 举报
回复
不带ref 是传值,带上ref是传址.
ArEoN 2003-03-13
  • 打赏
  • 举报
回复
同意timmy3310(tim)

siphonelee 2003-03-13
  • 打赏
  • 举报
回复
第一个:参数是对象,虽然实质上也是指针,但是在子函数内部不能改变,这是标准c里面规定的,子函数里面new的东西出了子函数的作用范围就失效了;
第二个:参数是引用,其实就是可以改变的指针,所以在子函数中new的对象(指针)可以回传。这个指针在主函数依然有效。

110,546

社区成员

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

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

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