天天看點

[C#基礎]ref和out的差別

  在c#中通過使用方法來擷取傳回值時,通常隻能得到一個傳回值。是以,當一個方法需要傳回多個值的時候,就需要用到ref和out,那麼這兩個方法差別在哪兒呢?

msdn:

       ref 關鍵字使參數按引用傳遞。其效果是,當控制權傳遞回調用方法時,在方法中對參數所做的任何更改都将反映在該變量中。若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。

      out 關鍵字會導緻參數通過引用來傳遞。這與 ref 關鍵字類似,不同之處在于 ref 要求變量必須在傳遞之前進行初始化。若要使用 out 參數,方法定義和調用方法都必須顯式使用 out 關鍵字。 

案例:

      定義一個方法,求一個整數數組中的最大值,最小值,和,平均數。如果是一個方法隻能有一個傳回值,那隻能每一個都得定義一個方法來實作,不過有了ref和out這實作起來就友善多了。

ref:

[C#基礎]ref和out的差別
[C#基礎]ref和out的差別

      然後在控制台中試着調用該方法:

[C#基礎]ref和out的差別
[C#基礎]ref和out的差別

      此時編譯器就會提示畫紅線,錯誤:使用了未指派的avg,max,min

[C#基礎]ref和out的差別
[C#基礎]ref和out的差別

運作結果:

[C#基礎]ref和out的差別

總結:

      ref這個關鍵字告訴c#編譯器被傳遞的參數值指向與調用代碼中變量相同的記憶體。這樣,如果被調用的方法修改了這些值然後傳回的話,調用代碼的變量也就被修改了。

      ref 關鍵字使參數按引用傳遞。其效果是,當控制權傳遞回調用方法時,在方法中對參數所做的任何更改都将反映在該變量中(avg,max,min的初始值為0,調用方法後值改變)。若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。

out:

      換成out之後,上面的方法不再适用,報錯,錯誤 : 控制離開目前方法之前必須對 out 參數“min”和"max"指派。你會發現這裡max和min在循環外并未初始化。是以才會出錯。

修改後代碼:

[C#基礎]ref和out的差別
[C#基礎]ref和out的差別
[C#基礎]ref和out的差別

     結果和上面一樣。

       out 關鍵字會導緻參數通過引用來傳遞。這與 ref 關鍵字類似,不同之處在于 ref 要求變量必須在傳遞之前進行初始化。若要使用 out 參數,方法定義和調用方法都必須顯式使用 out 關鍵字。

結論:

       關鍵字“ref“和”out”之間的唯一差別就是關鍵字”out“不要求調用代碼初始化要傳遞的參數值。那麼關鍵字‘ref”什麼時候用呢?當您需要確定調用方法已經初始化參數值的時候,您就應該使用關鍵字“ref”。在上面例子中,能夠使用“out“是因為被調用的方法并不依賴于被傳遞的變量的值。個中滋味慢慢體會......

後話:

      在一論壇裡面,偶然看到有這樣的文章,就順便總結了一下,也算是回憶一下c#基礎知識吧。

部落格位址:

<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>

部落格版權:

本文以學習、研究和分享為主,歡迎轉載,但必須在文章頁面明顯位置給出原文連接配接。

如果文中有不妥或者錯誤的地方還望高手的你指出,以免誤人子弟。如果覺得本文對你有所幫助不如【推薦】一下!如果你有更好的建議,不如留言一起讨論,共同進步!

再次感謝您耐心的讀完本篇文章。

轉載:http://www.cnblogs.com/wolf-sun/p/3371174.html