先看一个例子吧:
public class A
{
public int Member;
}
public class MyApp
{
private static void GetNoRefA(A noRefA)
{
noRefA=new A();
noRefA.Member=100;
}
private static void GetRefA(ref A refA)
{
refA=new A();
refA.Member=50;
}
public static void Main()
{
A appA=null;
// GetNoRefA(appA); //这里是黓认引用
// Console.Write(appA.Member.ToString()); //这里在运行时异常(空引用)
GetRefA(ref appA);
Console.Write(appA.Member.ToString()); //这时候是输出50
}
}
这确实是让人迷糊!(书上明明讲的引用对象黓认是引用开型参数,很多人就认为黓认的就是以REF形式传参了,包括我)好了讲一下我的理解吧(不知看我这文章的人熟不熟C++)
让我来说一下C++中传引用的方法吧(我知道你在心里想,这还不简单不就是用指针或地址引用,对,确实是这样,但为了说明我还是把它写一下)如:
void GetChar(char *message)
{
*message='a';
}
int _tmain(int argc, _TCHAR* argv[])
{
char mess;
GetChar(&mess);
cout<< mess << endl;
return 0;
}
不错,是这样的,我们得到了我们想要的结果,但接下来你会继续这样写:
void GetChar(char *message)
{
*message='a';
}
int _tmain(int argc, _TCHAR* argv[])
{
char *mess=0;
GetChar(mess);
cout<< mess << endl;
return 0;
}
这回你得犯愁了,运行时总出错吧!因为这是一个空引用(char *mess=0;)所以在GetChar内就使用就会出错,好了你可能会把它改成这样:
void GetChar(char *message)
{
message="abc";//"abc"是常数,会另外开避空间,也就是说这里的message会暂时指向
//"abc"的地址空间了,已经不再指向mess的地址了,如果这里是用new的话等于是发生了内存泄漏了
}
int _tmain(int argc, _TCHAR* argv[])
{
char *mess=new char[10];
memset(mess,0,sizeof(char)*10);
GetChar(mess);
cout<< mess << endl;
return 0;
}
运行时不出错了,但怎么输出的结果却什么都没有呢?好了这就是我们上面的主题了,我猜这也就是C#中的黓认的引用了,它只是传递对象的地址过去了,那如果我们要得到输出的结果是abc呢 ,接着看:
void GetChar(char **message)
{
*message="abc";
}
int _tmain(int argc, _TCHAR* argv[])
{
char *mess=new char[10];
memset(mess,0,sizeof(char)*10);
GetChar(&mess);
cout<< mess << endl;
return 0;
}
哦!可以了,因为这里是传了指针的指针,我猜这也就是c# ref了(之所以在内部使用像黓认的引用对象,只是做了些转换处理罢了),上面的C++代码也就不用我多解释了吧,呵呵!希望您看完提出保贵的意见!