程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 關於ref與out的區別

關於ref與out的區別

編輯:C#入門知識

寫在最前面

這幾天一直在公司接受培訓,都是一些基礎的知識,同時也乘著這個機會鞏固一下自己的基礎,基礎太重要了。前些時一直看的是多線程方面的知識,接下來我會寫一些其他方面的知識,畢竟作為一個實習新人得和自己從事的具體方向靠近,不過感覺前些時的多線程學的還不夠,今後有空還會繼續,暫時到此吧、、、

昨天培訓的時候有一個問題是關於ref和out的區別,悲催的我不知道,只曉得它們可以做引用傳遞,具體區別都沒一個概念額,貌似當年教我們C#初級的尹老師提到過一個數字交換實現可以用這個,不過當時也就僅此僅此,今天來學習下下

首先聲明下哈,此文參考了網上部分文章內容,然後結合自己的了解和總結,有不對的盡管拍磚

關於ref

經常聽到值類型和引用類型,其實本質就是一個存儲值一個存儲地址,看看下面一段代碼:

                           Test(              .num =                         x =  Test(                   Main(              Test ts =  Test(         }

對於以上代碼,你認為會輸出什麼結果?10?100?正確結果是10,猜100的肯定有疑問了、、、

接下來我改兩個位置,就不復制整個了,貼出改位置的兩個位置,如下所示:

    ts.ChangeNum(  ChangeNum( Test x)    //改上面第8行

對於這次的結果又得探討了,10?還是100?正確結果為100


以上截圖,左邊是原始代碼變量ts和x的地址,右邊是修改兩個位置後的ts和x的地址,從上面我們可以清晰的看見左圖ts地址(0x05f0eb2c)和x地址(0x05f0eacc)不同,右圖中ts的地址(0x0568ee6c)和x的地址(0x0568ee6c)相同。就是由於原始代碼中Main函數中的ts和Test中的x不是同一個變量,所以後面執行18行代碼不會對num值產生任何影響,而後面的兩行代碼就不同,因為所指向的是同一個變量,所以結果自然得以修改變為100

關於out

還是來看一段代碼,事實比較好說話,呵呵:

                           Test(              .num =            ChangeNum(              x =  Test(                   Main(              Test ts =  Test(              ts.ChangeNum(         }

以上這段代碼執行打印的兩個結果也是不同的,分別打印10和100,原理和上面差不多一樣,是不是感覺和上面講的ref很有點象,沒錯,所以有了今天的標題“關於ref與out的區別”,接下來談談其區別吧!

關於out和ref的區別

作為都可以作為引用傳遞,區別在於值傳遞。ref傳遞前必須初始化,而out不必初始化,就算初始化,也會被無視之,out 作為輸出參數,可以解決函數只有一個返回值的問題

           Main(              Program pg =                           pg.Method_1(               y =              pg.Method_2(    
           Method_1(               x = ;      
             Console.WriteLine(  
           Method_2(               x++             Console.WriteLine(         }

運行結果:

懷舊一下當年尹老師講的a=5和b=10,a與b數值交換,就是用的ref

           yy(  x,                            temp =             x =             y =            Main(              Program pg =               a =               b =              Console.WriteLine( + a +  +             pg.yy( a,             Console.WriteLine(+a++          }

然後以上代碼改為用out實現:

           yy( a, b,  x,               x =             y =            Main(              Program pg =               a =               b =              Console.WriteLine( + a +  +             pg.yy(a,b, a,             Console.WriteLine(+a++          }

自我感覺吧,在很多地方ref和out可以互換,起到相同的作用,個人感覺ref可以更隨意的使用,out總有那麼點別扭,畢竟必須在內部給其賦值。

實習的第一個雙休日

貌似此文扯了些不該扯得,但總的來說都是跟隨筆主要內容有些相關啦,接下來由於培訓內容的相關,得轉移重心了,Linq和EF還得再回去看看,所以後期可能寫點哪方面相關知識。晚睡的習慣還木有改過來,這是個問題得治啊,聽了一晚上的歌,單曲循環"想把我唱給你聽",好晚了,睡覺去也!!!

------如果你覺得此文對你有所幫助,別忘了點擊下右下角的推薦咯,謝謝!------

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved