上次在子敬兄的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类作类似测试。