参数传递(续)之——用Ref和Out关键字的按引用传递,以及用Params关键字传参...

用Ref和Out关键字的按引用传递比较分析:

     由上文《由String类型分析,所产生的对参数传递之惑的解答》 文,我们对值类型和引用类型,在用以关键字Ref传参时,所产生的可以导致原变量实现改变的结果进行了原因分析。然而用关键字Out的按引用传递(注:文中所说的"按引用传递",从英文翻译对号入座应为Ref,然而此处为了表示在传递时都传递的是参数的地址这一共性,故此处把按Ref关键字和按Out关键字传值,认为是按引用传递的两种方法。),在实现机理上可以达到和按Ref关键字传值完全相同的结果(这点从编译器所变异的代码是相同的这点得以验证!)。对此我们采用上文的测试环境,只对后台代码做适当修改,具体代码如下:

// Description: 通过代码测试,比较Ref和Out关键字的按引用传递的区别

// CopyRight:  http://www.cnblogs.com/yangmingming

// Notes: 环境是初始值为空的四个TextBox,前面的Lbel标签标示其作用
          
// 按钮标示调用函数,并通过TextBox值显示对比效果

public   partial   class  ParaDelivery : System.Web.UI.Page
{
    
protected   void  Page_Load( object  sender, EventArgs e)
    {

    }
    
protected   void  btnSubmit_Click( object  sender, EventArgs e)
    {
        
int  i  =   1 ;
        
// int i;
         string  str  =   " This is a String " ;
        
// string str;
        txtItiValue.Text  =  i.ToString();
        txtRefValue.Text 
=  str;
  
        AddValueType(
out    i);
        AddRefType(
out   str);
        txtChangedIntValue.Text 
=  i.ToString();
        txtChangedRefValue.Text 
=  str;
    }

    
// 两个被调用函数
     private   void  AddValueType( out    int  funi)
    {
        funi
= 2 ;
    }
    
private   void  AddRefType( out    string  funStr)
    {
        funStr 
= " This is a changed String " ;
    }
}

然而触发按钮事件的现实结果却完全如按Ref关键字的按引用传递结果,如下图示:

 

即按Out传值实现了和按Ref传值的效果。然而就细节来说,它们还是具有不同点的,具体概括如下:

1.Out传递方法,可以在函数调用之前未赋值,而按Ref传值在函数调用之前必须要赋值的;

2.目的性不同:Out传递方法,顾名思义,Out主要是为从函数获取值的(因为按引用传递方法可以实现原变量的改变!),进而赋予原变量的,这是主要目的。而按Ref则不是这个目的存在的(它有可能是在调用函数中作为"右值",而并不是为了被更新)。我想这也是设计者针对两种情况分而设定的吧,呵呵~

 

用Params关键字传值:

     先看一演示示例。后台代码即环境布置见说明:

// Description: 通过代码测试,说明Param关键字作用

// CopyRight:  http://www.cnblogs.com/yangmingming

// Notes: 通过设置两个提交按钮——分别可以实现调用同一个函数,而同时其参数个数不同
//  最后将结果反映在TextBox中

public   partial   class  ParamDelivery : System.Web.UI.Page
{
    
protected   void  Page_Load( object  sender, EventArgs e)
    {

    }
    
protected   void  btnSubmit1_Click( object  sender, EventArgs e)
    {
        
int  i  =   1 , j  =   2 , k  =   3 ;
        txtDisplaySum.Text 
=  AddParamSum(i, j, k).ToString();
    }
    
protected   void  btnSubmit2_Click( object  sender, EventArgs e)
    {
        
int  i  =   1 , j  =   2 , k  =   3 , l  =   4 , m  =   5 ;
        txtDisplaySum.Text 
=  AddParamSum(i, j, k, l, m).ToString();
    }
    
// 公共调用函数,实现参数的相加功能
     private   int  AddParamSum( params   int [] arrParam)
    {
        
int  sum  =   0 ;
        
for  ( int  i  =   0 ; i  <  arrParam.Length; i ++ )
        {
            sum 
+=  i;
        }
        
return  sum;
    }
}

当分别触发按钮1(btnSubmit1)和按钮2(btnSubmit2),所产生结果见下图示:

 

 

可见他们都实现了对各自参数的相加功能,这比使用重载的Add函数要简便的多(况且适应性更强了)。Params的实现机理即是通知编译器要将传递过来参数,包装成数组来处理。

附:在使用Params时注意事项:

1.Params所修饰的只能为一维数组;

2.Params可以修饰任何类型,将函数中类型定义为 Object;

3.在函数中,Params项必须置于最后位置;

 

综述之,作为对参数传递的补充部分,这里比较了按Ref关键字和按Out关键字的按引用传递,以及C#所提供的对于不定项数组的"智能方法"——Params关键字使用。至此对参数传递相关知识又做了一次回顾,呵呵

 

 

 

转载于:https://www.cnblogs.com/yangmingming/archive/2010/01/31/1660315.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值