5.C#知識點:ref和Out關鍵字淺談
首先我們要知道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(); } staticvoid Test(int i) { i++; Console.WriteLine(i.ToString()); } } }
這代碼沒啥含量,學過代碼都看到懂的,就是定義個i變量,然後調用Test方法,方法裏面對i進行+1的操作然後打印i的值,main函數裏也打印一次i的值。
結果大家應該也都知道 方法裏面打印的是main方法打印的是0,方法裏面是1。
因為默認情況下,我們方法傳遞變量默認是是"值傳遞"的方式。這是什麽意思呢?說到這裏要先解釋下引用類型和值類型,可以看我的一篇博客----->傳送門
解釋完畢,我們再把思路拉回來,我們說方法傳遞的變量默認是"值傳遞"。就是說我報紙看的哈哈大笑,這時候小明也想看。我就又買了一份給他。但是我們看的內容是一樣的。但是我的報紙還是我的報紙。小明看完報紙就撕了報紙都不影響我,值傳遞就是方法的變量的值傳遞值之後。不論方法裏面對這個值進行了什麽操作。都不影響我方法外面的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關鍵字淺談