[研究]引用实参的传递

上次在子敬兄的blog里看到一片文章,介绍C#的函数参数传递,原文地址:http://blog.csdn.net/newgrammer/archive/2005/10/27/517949.aspx

一直对这句话理解不到位:

按照值传递的机制传递一个引用类型的变量,实际上只是完成了一次浅拷贝。请不要误认为对整个对象进行了深拷贝。函数参数得到的只是实参的handle的值。也就是说,本地的参数实际上只是一个引用类型的handle,和作为实参传递过来的那个变量的handle具有相同的值,指向同一个object(两个handle指向堆上的相同位置)。这样我们在函数内部对参数所做的修改会直接影响到堆上的object。当函数结束之后,本地的参数消失,而对于堆上的object的修改会成为持久的修改而继续保留下来。 

于是决定写测试程序测试一下。

由于测试程序中使用了我自己写的类库Fraction.dll(用于描述分数的构建,运算,通分,还包括分数的运算符重载)不便公开,请各位另写代码,一下代码仅供测试:

//
//编译此程序,请将FractionTest.dll编译进去
//此程序向我们说明了引用实参的传递
//a的值改变
//b的值不变
/


using System;
using bEsoft.Library.FractionLib;

namespace Test.MethodRef
{
 public class Program
 {
  public static int Main()
  {
   Fraction a = new Fraction( 1, 2 );
   Fraction b = new Fraction( 1, 2 );
   Half( a );
   HalfX( b );
   Console.WriteLine( a );
   Console.WriteLine( b );
   return 0;
  }
  
  public static void Half( Fraction Frac )
  {
   Frac.Mom *= 2;
  }

  public static void HalfX( Fraction Frac )
  {
   Frac = new Fraction( Frac.Kid, Frac.Mom * 2 );
  }
 }
}

为了便于理解,解释一下我写的分数类,命名空间见程序内

Fraction的成员当然只有2个,一个是分子(Kid),一个是分母(Mom)

Fraction类的构造函数将分子和分母(依次)赋予新分数对象

同时Fraction类还重载了方法.ToString()。

 

基于本人的习惯,我用自己的类而么有用通用类,只要问题时我一下子忘记了哪个是结构哪个是类,有兴趣的朋友可以自己用point类作类似测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值