传值类型_what?你竟然不知道C#中的方法及参数的类型解析!那还不快来瞅瞅
前言
哈哈,今天來給大家講解一下關(guān)于C#中方法及參數(shù)的幾種類型解析,沒有看過的朋友,可以仔細的來瞧瞧了!
那么,還是話不多說,直接給大家獻上今天的干貨。
一、方法中參數(shù)的類型
1.in型參數(shù)
int 型參數(shù)通過值傳遞的方式將數(shù)值傳入方法中,即我們在Java中常見的方法。
2.ref型參數(shù)
該種類型的參數(shù)傳遞變量地址給方法(引用傳遞),傳遞前變量必須初始化。該類型與out型的區(qū)別在于:
1:ref 型傳遞變量前,變量必須初始化,否則編譯器會報錯,而out型則不需要初始化。
2:ref 型傳遞變量,數(shù)值可以傳入方法中,而out型無法將數(shù)據(jù)傳入方法中。換言之,ref 型有進有出,out 型只出不進。
3.out 型參數(shù)
與 ref 型類似,僅用于傳回結(jié)果。
4.注意事項
1:out型數(shù)據(jù)在方法中必須要賦值,否則編譯器會報錯。eg:如下圖若將代碼中的sum1方法的方法體 改為 a+=b; 則編譯器會報錯。原因:out 型只出不進,在沒給 a 賦值前是不能使用的 改為 b+=b+2; 編譯器也會報錯。原因:out 型數(shù)據(jù)在方法中必須要賦值。
2:重載方法時若兩個方法的區(qū)別僅限于一個參數(shù)類型為ref 另一個方法中為out,編譯器會報錯 eg:若將下面的代碼中將方法名 vsum1 改為 sum(或者將方法名 sum 改為 sum1),編譯器會報錯。
Error 1 Cannot define overloaded method ‘sum’ because it differs from another method only on ref and out
原因:參數(shù)類型區(qū)別僅限于為 ref 與為 out 時,若重載對編譯器而言兩者的元數(shù)據(jù)表示完全相同。
1. `class C{`2. `//1. in型參數(shù)`3. `publicvoid sum(int a, int b) {`4. `a += b;`5. `}`6. `//2. ref型參數(shù)`7. `publicvoid sum(refint a, int b) {`8. `a += b;`9. `}`10. `//3. out型參數(shù)`11. `publicvoid sum1(outint a, int b){`12. `a = b+2;`13. `}`14. `publicstaticvoidMain(string[] args) {`15. `C c = new C();`16. `int a = 1, b = 2;`17. `c.sum(a,b);`18. `Console.WriteLine("a:{0}", a);`19. `a = 1; b = 2;`20. `c.sum(ref a, b);`21. `Console.WriteLine("ref a:{0}", a);`22. `a = 1; b = 2;`23. `c.sum1(out a, b);`24. `Console.WriteLine("out a:{0}", a);`25. `}`26. `}`輸出結(jié)果:
從代碼也可以看出,int 型參數(shù)為值傳遞,所以當將變量 a 傳入方法時,變量 a 的值并不會發(fā)生變化。而 ref 型參數(shù),由于是引用傳遞,將變量的值和地址都傳入方法中故變量值改變。out 型無法將變量的值傳入。但可以將變量的地址傳入并為該地址上的變量賦值。
5.ref 和 out 的區(qū)別
一個用關(guān)鍵字 ref 表示,一個用 out 標示。
牽扯到數(shù)據(jù)是引用類型還是值類型。
一般用這兩個關(guān)鍵字你是想調(diào)用一個函數(shù)將某個值類型的數(shù)據(jù)通過一個函數(shù)后進行更改。傳 out 定義的參數(shù)進去的時候這個參數(shù)在函數(shù)內(nèi)部必須初始化。否則是不能進行編譯的。ref 和 out 都是傳遞數(shù)據(jù)的地址,正因為傳遞地址,才能對源數(shù)據(jù)進行修改。
一般情況下不加 ref 或者 out 的時候,傳值類型的數(shù)據(jù)進去實際上傳進去的是源數(shù)據(jù)的一個副本,也就是在內(nèi)存中新開辟了一塊空間,這里面存的值是與源數(shù)據(jù)相等的,這也就是為什么在傳值類型數(shù)據(jù)的時候你如果不用 return 是無法修改原值的原因。但是你如果用了 ref,或者 out,這一切問題都解決了,因為他們傳的是地址。
out 比起 ref 來說,還有一個用法就是可以作為多返回值來用,都知道函數(shù)只能有一個返回值,C#里,如果你想讓一個函數(shù)有多個返回值,那么OUT能很容易解決。
二、對于復(fù)雜引用類型參數(shù)傳遞的控制
所謂復(fù)雜,是參數(shù)是數(shù)組或集合類型,或者參數(shù)包含這些類型數(shù)據(jù),這種情況下上面的方法不能保證參數(shù)數(shù)據(jù)不被修改,因為即使對象為只讀的,但是對象中的數(shù)組或集合字段(屬性)還是可以修改的。
1.集合參數(shù)(包含集合字段的引用參數(shù)也一樣)
.net 4.5以前版本可以使用不包含修改集合元素方法的接口來代替具體集合類型。例如使用IEnumerable接口代替List。4.5版本可以直接使用IReadOnlyCollection接口或?qū)崿F(xiàn)該接口的集合類型。
2.數(shù)組參數(shù)
沒有好的辦法保護數(shù)組類型參數(shù)不被修改,所以盡量避免使用數(shù)組類型作為方法參數(shù),除非用到可選參數(shù)時候。
三、擴展方法
擴展方法可以實現(xiàn)在不需要修改目標類,也不需要繼承目標類的情況下為其添加一個方法。規(guī)則:
1、擴展類必須為靜態(tài)類,擴展方法必須為靜態(tài)方法。
2、擴展方法的第1個形參開頭必須使用 “this” 關(guān)鍵字然后再填寫擴展的目標類。
3、如果需要接收參數(shù)則從第2個參數(shù)開始算起,第1個參數(shù)在真正調(diào)用方法時是隱藏的。
1. `publicstaticclassExtensionString{`2. `//向 String 類擴展一個統(tǒng)計單詞數(shù)量的方法`3. `publicstaticintCountWord(thisString str) {`4. `return str.Split(' ').Length;`5. `}`6. `}`8. `classMainClass{`9. `publicstaticvoidMain(string[] args) {`10. `Console.WriteLine("單詞數(shù)量:"+ "Hello World".CountWord()); //沒有參數(shù)`11. `}`12. `}`總結(jié)
以上是生活随笔為你收集整理的传值类型_what?你竟然不知道C#中的方法及参数的类型解析!那还不快来瞅瞅的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 和smi_nvidia-smi 报错:无
- 下一篇: 轴自定义图标_9种吸引人的图标样式,能给