导航
  • 主页
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm
  • WPF
  • 问答

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

希偌 深圳市车厘子网络科技有些公司 CTO/CIO/技术副总裁/总工程师  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;
}
}
...全文
9 点赞 收藏 6
写回复
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的对象(指针)可以回传。这个指针在主函数依然有效。
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.