這幾天一直在公司接受培訓,都是一些基礎的知識,同時也乘著這個機會鞏固一下自己的基礎,基礎太重要了。前些時一直看的是多線程方面的知識,接下來我會寫一些其他方面的知識,畢竟作為一個實習新人得和自己從事的具體方向靠近,不過感覺前些時的多線程學的還不夠,今後有空還會繼續,暫時到此吧、、、
昨天培訓的時候有一個問題是關於ref和out的區別,悲催的我不知道,只曉得它們可以做引用傳遞,具體區別都沒一個概念額,貌似當年教我們C#初級的尹老師提到過一個數字交換實現可以用這個,不過當時也就僅此僅此,今天來學習下下
首先聲明下哈,此文參考了網上部分文章內容,然後結合自己的了解和總結,有不對的盡管拍磚
經常聽到值類型和引用類型,其實本質就是一個存儲值一個存儲地址,看看下面一段代碼:
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
還是來看一段代碼,事實比較好說話,呵呵:
Test( .num = ChangeNum( x = Test( Main( Test ts = Test( ts.ChangeNum( }
以上這段代碼執行打印的兩個結果也是不同的,分別打印10和100,原理和上面差不多一樣,是不是感覺和上面講的ref很有點象,沒錯,所以有了今天的標題“關於ref與out的區別”,接下來談談其區別吧!
作為都可以作為引用傳遞,區別在於值傳遞。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還得再回去看看,所以後期可能寫點哪方面相關知識。晚睡的習慣還木有改過來,這是個問題得治啊,聽了一晚上的歌,單曲循環"想把我唱給你聽",好晚了,睡覺去也!!!
------如果你覺得此文對你有所幫助,別忘了點擊下右下角的推薦咯,謝謝!------