NET參數(shù)傳遞剖析_第1頁
NET參數(shù)傳遞剖析_第2頁
NET參數(shù)傳遞剖析_第3頁
NET參數(shù)傳遞剖析_第4頁
NET參數(shù)傳遞剖析_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 .Net參數(shù)傳遞剖析本篇文章主要討論以下三個內容:1:按值傳遞和按引用傳遞分析2:ref和out 比較3:參數(shù)應用開始之前,先提幾個問題,共大家思考?帶著這幾個問題來閱讀本文1:什么是按值傳遞,什么是按引用傳遞?2:值傳遞和引用傳遞的區(qū)別?3:ref與out在引用傳遞中區(qū)別與應用如何?4:param修飾符在參數(shù)傳遞中扮演何種角色?1:基本概念 參數(shù)實現(xiàn)了不同方法間的數(shù)據(jù)傳遞,即信息交換。例如典型的Main入口函數(shù)就有一個string數(shù)組參數(shù),args是函數(shù)命令行參數(shù)。參數(shù)分為形參和實參。形參就是被調用方法的參數(shù),而實參就是調用方法的參數(shù)。例如:Public Class Test Public

2、 static void Main(string args) String strMess=”Hello World!”;/strMes在這里就是實參 Show(strMes);/Message在這里就是形參Public static void Show(string Message) Console.WriteLine(Message);需要注意的是:1:形參和實參必須在類型,個數(shù)和順序上一致。2:參數(shù)可以為空。3:Main(string args),Main函數(shù)的參數(shù)可以為空,也可以為string數(shù)組,其作用是接受命令行參數(shù),例如在命令行下運行程序時,args提供了輸入命令行參數(shù)的入口。4

3、:泛型類型參數(shù),可以是靜態(tài)的,例如MyGeneric; 也可以是動態(tài)的,此時它其實就是一個占位符,例如MyGeneric中的T可以是任何類型的變量,在運行期動態(tài)替換為相應的類型參數(shù)。泛型參數(shù)類型一般也以T開頭來命名。2:Param修飾符下面來重點討論param參數(shù)一般來說參數(shù)個數(shù)都是固定的,但.Net也提供了更靈活的機制來實現(xiàn)可變的數(shù)目參數(shù),這就是用param修飾符。例如:Public Class Test Static void Main(string args)/編譯器找到相應的方法就先調用不包含param特性的方法 Show(1,2,3,4);/編譯器找不到五個參數(shù)的方法,因此就調用包括

4、param特性的方法,同時構造者5個整/為一維整形數(shù)組。 Show(1,2,3,4,5);Static void Show(int i, int j, int k)Console.WriteLin(“i=0 j=1 k=2”);Static void Show(param int ages) Int total=0; For(int i=0; iages.Length;i+) total+=agesi;Console.WriteLine(“The total age is 0”,total); Param關鍵字的實質是:param是定制特性ParamArrayAttribute的縮寫,該特性用

5、于指示編譯器的執(zhí)行過程大概可以簡化為:編譯器檢測到方法調用時,首先調用不包含ParamArrayAttribuyte特性的方法,如果存在這種方法就調用,如果不存在才調用ParamArrayAttribute特性的方法。Param 修飾的參數(shù)必須為一維數(shù)組。Param修飾的參數(shù)數(shù)組可以是任何類型Param必須在參數(shù)列表的最后一個,并且只能用一次。3深入討論參數(shù)的傳遞1:值類型參數(shù)的按值傳遞參數(shù)傳遞根據(jù)參數(shù)類型分為按值傳遞和按引用傳遞,默認情況下都是按值傳遞的。按值傳遞主要包括值類型參數(shù)的按值傳遞和引用類型參數(shù)的按值傳遞。值類型實例傳遞的是該值類型實例的一個拷貝,因此被調用方法操作的是屬于自己本身

6、的實例拷貝,因此不影響原來調用方法中實例值。2:引用類型參數(shù)按值傳送 當傳遞的參數(shù)為引用類型時,傳遞和操作的是指向對象的引用,這意味著方法操作可以改變原來的對象,但是值得的是該引用或者說指針本身還是按值傳遞, 因此,必須清楚以下兩個最根本的問題: 1:引用類型參數(shù)的按值傳遞和按引用傳遞的區(qū)別? 2:string類型作為特殊的引用類型,在按值傳遞時表現(xiàn)的特殊性又如何解釋?首先,我們從基本的理解入手來了解引用類型參數(shù)按值傳遞的本質所在,簡單的說對象作為參數(shù)傳遞時,執(zhí)行的是對對象地址的拷貝,操作的是該拷貝地址。這在本質上和值類型按值傳遞是相同的,都是按值傳遞。不同的是值類型的“值”為類型實例,而引用

7、類型的“值“為引用地址。因此,如果參數(shù)為引用類型時,在調用代碼中,可以改變引用的指向,從而使得原對象的指向發(fā)生改變??偨Y:按值傳遞的實質是值傳遞,不同的是這個值在值類型和引用類型的表現(xiàn)是不同的:參數(shù)為值類型時,“值“為實例本身,因此傳遞的是實例拷貝,不會對原來的實例產生影響;參數(shù)為引用類型時,“值”為對象引用,因此傳遞的是引用地址拷貝,會改變原來對象的引用指向。3:引用類型參數(shù)按引用傳遞了解了引用類型參數(shù)按值傳遞的實質,我們再引入另一個參數(shù)傳遞的概念:按引用傳遞,通常稱為引用參數(shù),這二者的本質區(qū)別可以小結為: 1:引用類型參數(shù)的按值傳遞,傳遞的是參數(shù)本身的值,也就是對象的引用; 2:按引用傳遞

8、,傳遞的不是參數(shù)本身的值,而是參數(shù)的地址。如果參數(shù)為值類型,則傳遞的是該值類型的地址;如果參數(shù)為引用類型,在傳遞是對象引用的地址。classhow2strstaticvoidMain()stringstr=OldString;ChangeStr(str);Console.WriteLine(str);staticvoidChangeStr(stringaStr)aStr=ChangingString;Console.WriteLine(aStr);下面對上述示例的執(zhí)行過程簡要分析一下:首先,string str = Old String產生了一個新的string對象,如圖表示: 然后執(zhí)行Cha

9、ngeStr(aStr),也就是進行引用類型參數(shù)的按值傳遞,我們強調說這里傳遞的是引用類型的引用值,也就是地址指針;然后調用ChangeStr方法,過程aStr = Changing String完成了以下的操作,先在新的一個地址生成一個string對象,該新對象的值為Changing String,引用地址為0x06賦給參數(shù)aStr,因此會改變aStr的指向,但是并沒有改變原來方法外str的引用地址,執(zhí)行過程可以表示為: 因此執(zhí)行結果就可想而知,我們從分析過程就可以發(fā)現(xiàn)string作為引用類型,在按值傳遞過程中和其他引用類型是一樣的。如果需要完成ChangeStr()調用后,改變原來str的

10、值,就必須使用ref或者out修飾符,按照按引用傳遞的方式來進行就可以了,屆時aStr = Changing String改變的是str的引用,也就改變了str的指向,具體的分析希望大家通過接下來的按引用傳遞的揭密之后,可以自行分析。 4:按引用傳遞ref和out不管是值類型還是引用類型,按引用傳遞必須以ref和out關鍵字來修飾,其原則是:1:方法定義和方法調用必須同時顯示的使用ref或者out.2: CLR 運行通過out或ref參數(shù)來重載方法。classTestRefAndOutstaticvoidShowInfo(stringstr)Console.WriteLine(str);sta

11、ticvoidShowInfo(refstringstr)Console.WriteLine(str);當然,按引用傳遞時,不過參數(shù)是值類型還是引用類型,在本質上也是相同的,ref和out關鍵字將告訴編譯器,方法傳遞的是參數(shù)地址,而不是參數(shù)本身。3:不管參數(shù)本身是值類型還是引用類型,按引用傳遞是,傳遞的是參數(shù)的地址,也就是實例的指針。4:如果是值類型,則按引用傳遞時,傳遞的是值類型變量的音樂,因此在效果上類似于引用類型參數(shù)的按值傳遞方式,其實質可以分析為:值類型的按引用傳遞方式,實現(xiàn)的是對值類型實例的直接操作,方法調用方為該實例分配內存,而被調用方法操作該內存,也就是值類型的地址;而引用類型參數(shù)的按值傳遞方式,實現(xiàn)的是對引用類型的“值”引用指針的操作。 classTestArgsstaticvoidMain(stringargs)inti=100;stringstr=One;ChangeBy

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論