1. 程式人生 > >5.C#知識點:ref和Out關鍵字淺談

5.C#知識點:ref和Out關鍵字淺談

generic 說明 需要 某某 mil 打印 通過 所有 read

首先我們要知道ref和out在C#裏面是什麽?

答:它們倆是C#裏面的關鍵字。

他們倆是幹啥的呢?

答:他們倆是方法參數的修飾符號,一但使用,方法定義和方法都用都要使用這個關鍵字,這一點是死規定。

好了廢話不多說,既然是修飾符,使用了他們一定是要有意義的對吧。我們先來看一手微軟官方定義。

技術分享圖片

如果大家通過上面微軟官方的定義明白了這個參數。那很好,下面的我寫的就不需要看啦!還有疑惑就繼續往下看。保證你能懂。

這裏我先不直接講解,我先掏出一手代碼,然後通過代碼講解。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Threading.Tasks; namespace ref和outTest { class Program { static void Main(string[] args) { int i = 0; Test(i); Console.WriteLine(i.ToString()); Console.ReadKey(); } static
void Test(int i) { i++; Console.WriteLine(i.ToString()); } } }

  這代碼沒啥含量,學過代碼都看到懂的,就是定義個i變量,然後調用Test方法,方法裏面對i進行+1的操作然後打印i的值,main函數裏也打印一次i的值。

結果大家應該也都知道 方法裏面打印的是main方法打印的是0,方法裏面是1。

  因為默認情況下,我們方法傳遞變量默認是是"值傳遞"的方式。這是什麽意思呢?說到這裏要先解釋下引用類型和值類型,可以看我的一篇博客----->傳送門

。我這裏簡單說下。引用類型的值存的是指向對象本身或者值的地址,值類型的變量存的是對象的本身或者是值。一個經典的比喻,值類型就是報紙,引用類型就是網頁。我看報紙就要買一份報紙。我得到的就是實際的報紙,但是我瀏覽網頁只要輸入一個Url地址。Url指向了實際網站內容。

  解釋完畢,我們再把思路拉回來,我們說方法傳遞的變量默認是"值傳遞"。就是說我報紙看的哈哈大笑,這時候小明也想看。我就又買了一份給他。但是我們看的內容是一樣的。但是我的報紙還是我的報紙。小明看完報紙就撕了報紙都不影響我,值傳遞就是方法的變量的值傳遞值之後。不論方法裏面對這個值進行了什麽操作。都不影響我方法外面的i。所以這個地方輸出的結果是 1和0

技術分享圖片

我覺得上面應該講的還挺易懂的吧,還有疑問算我失敗。

接下來我們加上Ref關鍵字了,改一手代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ref和outTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            Test(ref i);
            Console.WriteLine(i.ToString());
            Console.ReadKey();
        }
        static void Test(ref int i)
        {
            i++;
            Console.WriteLine(i.ToString());
            
        }
    }
}

ref關鍵字,文章的開頭微軟的官方解釋已經說明了。使用了Ref參數之後,方法參數的傳遞是按"引用傳遞"的,"引用傳遞"什麽意思上面講解我也解釋了。舉個例子,這就比如我看到某某網站不順眼。就找了一個黑客,然後把網站地址告訴了黑客,讓它幫我黑了這個網站。讓黑客在網站的首頁顯示"一小時小超人最帥的字",要特大號顯示,那黑客就會通過我給的Url黑了這個網站的服務器。然後我一刷新網頁。這個網頁就顯示了"一小時小超人最帥"。

這個代碼也是一樣。加了ref 之後 i變量傳遞是對象的引用也是網頁的Url,方法內部修改是通過這個地址找了真的值然後進行修改,所有外面的i也發生了變化。

技術分享圖片

講到這裏大家應該明白了吧。

out關鍵字和ref 都是使變量通過引用傳遞。這一點他們是一樣的。唯一的不通就是。ref的參數必須在調用方法前就初始化。而out參數必須在方法內部初始化。通過這一點的不同通他們的應用場景也就不同了。

場景一個 有個程序是 中國人民幣的匯率進行換算。現在有10塊錢。要通過一個方法進行換算。這個時候就應該用ref。因為這個10塊錢初始值很重要對吧。我必須在方法外面就要定義我的人民幣是多少錢。

場景二就是 int.TryPase(參數1, out 參數2)這個C#轉換方法,通過參數1,將參數2轉換為int類型。這個時候參數2的初始值是多少就沒有意義了是吧,因為它最後計算的結果,是跟參數1的值有關系,跟它初始值的沒有一毛錢的關系的。所以這個地方應該用out。

Ok。講到這裏就結束了哈。

如果剛開始學習的小夥伴還有疑問的話,可以評論咱們一起學習。

如果哪位大牛隨便瞄到個錯誤,也請告之我,讓我能夠進步。

對了out的代碼沒有,是因為兩個語法是一樣的。

5.C#知識點:ref和Out關鍵字淺談