1. 程式人生 > >C# out、ref關鍵字的用法和區別

C# out、ref關鍵字的用法和區別

說說自己對out、ref的認識,面試問到的機率很高喲。

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
    }
輸出:



總結:

  • out、ref都是引用傳遞 (傳遞後改變傳遞的值會影響原來的值)
  •   out不需要初始化 需要在傳入的方法內部完成初始化賦值     ref必須初始化賦值
  •   out用於獲取函式內部的值                       ref可同時改變函式內和函式外的值