一、复习
1、以传值方式传递引用类型的实质——传递地址!
二、新课——传引用方式
1、引入
问题:
如果需要在方法中使用new运算符对原始数组进行重新分配内存怎么办?
如果希望通过传递一个值类型参数,在方法内对该参数的修改返回原始参数,怎么办?
C#解决办法:
使用ref和out关键字
2、传引用方式
ref和out关键字指出一个值类型变量或引用类型变量应该以传引用方式传递。如果使用关键字ref和out通过引用传递变量,则方法能够修改变量本身。
若要使用ref 参数,必须将参数作为 ref 参数显式地传递到方法。ref 参数的值被传递到 ref 参数。传递到 ref 参数的参数必须最先初始化。
ref参数变量在可以作为引用参数传递之前,必须明确赋值。
3、例题
任务4.8分析——ref
这里:Textref类中的x1,y1,width1,height1作为实参,传递给getXYWH()方法中的形参ax,ay,awidth,aheight,使用了关键字ref。进行的是传引用。
因此:在方法中对这四个形参的改变直接影响对实参的值的改变。
任务4.9分析——out
书上的例子看完了(任务啊),我们来写一个自己,更好的体会一下。
这个例子,通过yunsuan方法,对x和y进行了运算,如果我们使用return将无法同时传递两个值,所以我们运用了ref传引用。这样x1和x其实是一个变量,x1的改变直接影响到x。
考虑,同样是传引用,将ref改成out可以么?——不可以,需要将x和y的初值传递给x1和y1。
改成这样,out就可以了
y不需要有初值,只需要有值传回来,所以可以使用out。
4、ref和out比较
- ref参数变量在可以作为引用参数传递之前,必须明确赋值。
- out参数变量可以不被赋值。
- out参数必须在被调用方法内修改。
- ref参数可以被修改,也可以不被修改。
5、实训练习
编写程序,模拟投掷硬币,用户按一次Toss按钮则表示“掷”一次硬币,记录硬币的每面出现的次数,并显示结果。程序调用传引用的方法flip,分别统计正反面的次数。
思考:如果模拟硬币的正方面?