關於C#中ref與out參數的理解

/*ref與out參數的使用*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace conapp_6_out與ref的使用
{
    //定義類中兩個方法,分別有ref和out參數時不能OverLoad
    class CS0663_Example
    {
        // Compiler error CS0663: "Cannot define overloaded
        // methods that differ only on ref and out".
        //public void SampleMethod(out int i) { }
        public void SampleMethod(ref int i) { }
    }

    //如果一個方法採用 ref 或 out 參數,而另一個方法不採用這兩類參數,則可以進行重載,如下所示
    class RefOutOverloadExample
    {
        // 定義兩個方法,第一個沒有out參數,第二個有out參數,這種情況支持方法重載
        public void SampleMethod(int i) { }
        public void SampleMethod(out int i)
        {
            //注意事項:利用out參數時在方法中必爲out參數賦值,不然會編譯報錯。
            i = 300;
            Console.WriteLine("i的值爲:{0}", i);
        }
    }

    class RefOverloadExample
    {
        // 定義兩個方法,第一個沒有ref參數,第二個有ref參數,這種情況支持方法重載
        public void SampleMethod(int i)
        {
            Console.WriteLine("第一次重載的值爲:{0}!", i);
           
        }
        public void SampleMethod(ref int i)
        {
            //注意事項:利用ref參數時在方法可以不爲ref參數賦值,也可以爲ref參數賦值,修改主調方法的變量值.
               
            //i = 300;
            Console.WriteLine("重載i的值爲:{0}", i);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //RefOutOverloadExample類方法的調用
            RefOutOverloadExample RO = new RefOutOverloadExample();
            //重載方法SampleMethod(int i)
            RO.SampleMethod(100);
            int num = 200;
            //重載方法SampleMethod(out int i)
            RO.SampleMethod(out num);
            Console.WriteLine("i的值爲:{0}!", num);
            Console.ReadLine();


            //RefOverloadExample類方法的調用
            RefOverloadExample R = new RefOverloadExample();
            ////重載方法SampleMethod(int i)
            R.SampleMethod(200);
            //重載方法SampleMethod(ref int i)
            int numm = 500;
            R.SampleMethod(ref numm);
            Console.WriteLine("第二次的值爲:{0}!", numm);
            Console.ReadLine();


           
        }
    }
}
總結:本人認爲,ref與out其實都是表示地址傳遞,與值傳遞有着本質的區別。ref和out參數的根本區別在於,在調用方法中,out參數一定要求對參數重新賦值,而ref則可以不用對參數重新賦值(當然也可以重新賦值),還有就是對於重新賦值ref和out方法的重載,當類中定義兩個方法中,有一個有out參數,另一個有ref的參數,則不能執行方法重載,但如果只有一個out或是ref時,則可以執行重載。以上是本人的一點認識,希望大家指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章