java ref 值传递_Java的值传递与C#的ref/out

最近用到了一个C#写成的桌面程序,并需要对其修改。C#作为一个静态的高级语言,很多特征与Java类似,当然也有大量的不同。在看代码时,发现有的函数签名的参数中出现了out关键字,便搜索了一下,结果得知这个关键字涉及了值传递与引用传递的问题。要学习明白这个关键字,首先要理解值传递和引用传递的问题,不妨先从更加熟悉的Java入手。

Java的传递方式

乍一看,很容易认为Java使用引用传递,原因是Java中无处不在的“引用”,Reference。在Java中,可以将一个引用传入方法,在方法中修改对象的属性,比如:static void paintWhite(Car car){

car.setColor(Color.WHITE);

}

首先创建一个Car对象,Car bmw = new Car("BMWCar);bmw.setColor(Color.RED); 调用paintWhite(bmw)并返回之后,传入函数的bmw对象的颜色变成了白色。看起来很容易认为是引用传递,然而再看另一个例子:static void changeCar(Car car){

car = new Car("BentzCar");

}

同样传入新建的bmw对象,changeCar(bmw);,返回后,再调用bmw.printName(),会发现结果仍然是”BMWCar”,而非想象中的”BentzCar”。这就说明了,Java的传递方式,并非引用传递。

实际上,bmw是对一个Car对象的引用,在bmw被传入函数的时候,因为值传递的特性,这个引用在函数的内部产生了一个副本。当我们操作函数内部bmw副本引用时,引用的对象仍然是同一个Car对象,所以函数内部所有对bmw的操作,在函数返回后仍然会生效,也就是上例中的颜色被改变。

然而,在函数中对bmw引用副本进行赋值时,情况就不一样了。bmw引用的副本在赋值后,指向了一个新的Car对象。因为是值传递,所有函数外面的bmw引用仍然指向原来的Car对象,没有发生变化。所以,函数返回后,bmw无法对新的Car对象进行操作,因为没有拿到其引用。

C#中的ref/out关键字

在默认情况下,C#也是一个使用值传递的语言。然而与Java不同的是,C#可以使用ref或者out关键字来进行引用传递。同样使用上面的例子,将changeCar的签名修改为static void ChangeCar(ref Car car),在调用时使用ChangeCar(ref bmw),在打印时就会发现,bmw指向的对象被更换成为了bentz。同样将上面的ref都替换为out也能得到相同的结果。

通过引用传递,bmw引用本身被传进了函数,成功更换了指向的对象,并在函数外部也同样生效。

而ref与out的区别就是,out会将传入的引用清空,所以必须先进行初始化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值