C#中ref和out的相關知識

C#中變量之間的傳遞默認是值傳遞,什麼叫值傳遞呢?就是說,當一個方法需要我事先定義的變量作爲參數的時候,默認只是把變量的值傳遞過去了。
例如:

namespace ConsoleApplication1
{
    class Program
    {
        static void A(int x)
        {

            Console.WriteLine(x);
            x++;
            Console.WriteLine(x);
        }

        static void Main(string[] args)
        {
            int x=0;
            A(x);
            Console.WriteLine(x);
            Console.ReadKey();
        }
    }
}

A方法需要Main()方法中的變量x作爲參數,此時知識把“0”傳遞給了方法A,A裏面做了x++的運算,但是不影響Main()方法裏面x的值,折舊相當於A方法中定義了另一個變量y用來承接x,A裏面操作的是y,而不是x,因爲A裏面定義了一個int x,這兩個x是不一樣的,因爲它們指向不同的地址。
這裏寫圖片描述
那麼我們希望Main()和A()都指向同一個地址的x怎麼辦呢?
那就不用值傳遞,用引用傳遞吧,把一個值作爲一個引用傳遞過去。
ref和out就是專門幹這種勾當的!
它們的區別是:用ref的時候要確保值已經被賦值了,而有的時候事先賦值沒有意義,那就用out;

namespace ConsoleApplication1
{
    class Program
    {
        static void A(ref int x)  //區別在這裏
        {

            Console.WriteLine(x);
            x++;
            Console.WriteLine(x);
        }

        static void Main(string[] args)
        {
            int x=0;
            A(ref x);    //區別在這裏
            Console.WriteLine(x);
            Console.ReadKey();
        }
    }
}

最後輸出:
這裏寫圖片描述
注意,上面的代碼中,int x=0;不給它賦值的話就會報錯:
這裏寫圖片描述
不賦值怎麼辦呢?那就用out唄:

namespace ConsoleApplication1
{
    class Program
    {
        static void A(out int x)
        {
            x = 2;    //這裏再給它賦值
            Console.WriteLine(x);
            x++;
            Console.WriteLine(x);
        }

        static void Main(string[] args)
        {
            int x;
            A(out x);
            Console.WriteLine(x);
            Console.ReadKey();
        }
    }
}

運行結果:
這裏寫圖片描述
事實證明:ref和out都可以把變量從值傳遞變換爲引用傳遞。

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