C# out、ref关键字的用法和区别

首先:两者都是按地址传递的,使用后都将改变原来参数的数值。

其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,ref是有进有出,out是只出不进。

out:

class Program  
{  
    /* 
     * out、ref都是引用传递,传递后使用都会改变原有的值 
     * out是只出不进。ref是有进有出, 
     *  
     * out用法,一般用于需要返回多个参数时,如在需要返回分页的数据时 同时返回总条数或者TryParse()会用到 
     * ref用法,一般用于在改变一个参数时,把他的改变反应到变量中 如在递归中 
     *  
     */  
  #region Out  
    static void Main(string[] args)  
    {  
        Program p = new Program();  
  
        //out传递参数时不用赋值(如果赋值也会被清空)  
        string out_s;  
        p.out_func(out out_s);  
        Console.WriteLine(out_s);  
  
  
        Console.ReadLine();//暂停窗口  
    }  
  
    /// <summary>  
    /// out传入后需要赋值才能返回  
    /// </summary>  
    /// <param name="i"></param>  
    public void out_func(out string s)  
    {  
        s = "out参数已赋值,返回。";  
    }  
  #endregion  
}  


ref:

class Program  
   {  
     #region ref  
       static void Main(string[] args)  
       {  
           Program p = new Program();  
           
           //ref传递时如果未初始化赋值 则会报错 :使用了未赋值的局部变量“ref_s”      
           string ref_s = "已初始化。";  
           p.ref_func(ref ref_s);  
           Console.WriteLine("返回的ref参数:" + ref_s);  
  
  
           Console.ReadLine();//暂停窗口  
       }  
  
       /// <summary>  
       /// ref传入前需要赋值,传入后可不做操作返回原值  
       /// </summary>  
       /// <param name="s"></param>  
       public void ref_func(ref string s)  
       {  
           Console.WriteLine("传入的ref参数:" + s);  
           s += "已赋值返回。";  
       }  
       
     #endregion  
   }  



总结起来ref与out差别就是:

  1. ref在传给方法前需要初始化,out不需要。
  2. out在方法内必须被赋值,否则会出现编译错误。
  3. out在传给方法时会被还原至未初始化状态,所以在方法执行前对out参数进行初始化和不进行的效果上是一样的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值