[原创]关于C#中的REF和黓认引用的思考

博客通过代码示例,对比分析了C#和C++中引用传递的情况。在C#里,默认引用传递对象地址,ref传对象地址的地址;在C++中,使用指针或地址引用传参,不同使用方式会导致不同结果,如空引用会出错等。

先看一个例子吧:
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"是常数(如果这用NEW的话会另外开避空间),也就是说这里的message(指向mess)会暂时指向
   //"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++代码也就不用我多解释了吧,呵呵!
希望您看完提出保贵的意见!

回复刘寓(我的浏览器中验证码看不到):C#中值类型确实是传值的,但引用类型却是传引用的(地址),你最好去看看书查一下资料了核实一下,只是黓认传引用是传对象的地址(对象的指针),而用ref却是传对象的地址的地址(对象的指针的指针) 个人认为是这样的,希望大家更好的理解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值