首先我們要知道ref和out在C#裡面是什麼? 答:它們倆是C#裡面的關鍵字。 他們倆是幹啥的呢? 答:他們倆是方法參數的修飾符號,一但使用,方法定義和方法都用都要使用這個關鍵字,這一點是死規定。 好了廢話不多說,既然是修飾符,使用了他們一定是要有意義的對吧。我們先來看一手微軟官方定義。 如果大家通 ...
首先我們要知道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的代碼沒有,是因為兩個語法是一樣的。