c# params 工作原理。
生活随笔
收集整理的這篇文章主要介紹了
c# params 工作原理。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
高級語言之所以成為高級語言,編譯器付出了很多。params在給我們帶來方便的同時,編譯器也是貢獻不少。
實例代碼:
using?System; public?class?Test { public?static?void?Main(){????Console.WriteLine("結果1"); say("hello","world");Console.WriteLine("結果2"); say("aaaa","sssss","ddddd");Console.ReadKey();}public?static?void?say(string?str,string?str2) { Console.WriteLine("single");Console.WriteLine(str);Console.WriteLine(str2); }public?static?void?say(params?string[]?str){Console.WriteLine("params");foreach(string?s?in?str) ????{Console.WriteLine(s);}} }說明下目的,
?say("hello","world");是為了驗證在參數同時適配
public?static?void?say(string?str,string?str2) public?static?void?say(params?string[]?str)的時候,編譯器是調用哪個函數。
??say("aaaa","sssss","ddddd");是為了察看params的運作過程
代碼結果:
分析:
從結果1可看出在同時符合確定變量和可變變量的時候,編譯器調用的是確定變量的函數,至于原因等說完params在提。
反編譯這段代碼。
注意參數,這里并沒有出現params字樣,說明到這個層級是不存在params了,接著看main函數。
.method?public?hidebysig?static?void??Main()?cil?managed {.entrypoint//?Code?size???????79?(0x4f).maxstack??3.locals?init?(string[]?V_0)IL_0000:??ldstr??????bytearray?(D3?7E?9C?67?31?00?)???????????????????????????????//?.~.g1.IL_0005:??call???????void?[mscorlib]System.Console::WriteLine(string)IL_000a:??ldstr??????"hello"IL_000f:??ldstr??????"world"IL_0014:??call???????void?Test::say(string,string)???????????????????????????????????????????????????????//?結果1的調用IL_0019:??ldstr??????bytearray?(D3?7E?9C?67?32?00?)???????????????????????????????//?.~.g2.IL_001e:??call???????void?[mscorlib]System.Console::WriteLine(string)IL_0023:??ldc.i4.3IL_0024:??newarr?????[mscorlib]System.StringIL_0029:??stloc.0IL_002a:??ldloc.0IL_002b:??ldc.i4.0IL_002c:??ldstr??????"aaaa"IL_0031:??stelem.refIL_0032:??ldloc.0IL_0033:??ldc.i4.1IL_0034:??ldstr??????"sssss"IL_0039:??stelem.refIL_003a:??ldloc.0IL_003b:??ldc.i4.2IL_003c:??ldstr??????"ddddd"IL_0041:??stelem.refIL_0042:??ldloc.0IL_0043:??call???????void?Test::say(string[])???????????????????????????????????????//結果2的調用IL_0048:??call???????valuetype?[mscorlib]System.ConsoleKeyInfo?[mscorlib]System.Console::ReadKey()IL_004d:??popIL_004e:??ret }?//?end?of?method?Test::Main從結果1可以清楚地看到調用的是確定參數函數,往下的IL_0024構建了一個數組,然后在一個個的把參數推送進數組,最后調用了say(string[] )函數.
結論:?
params的實現只是將單個的參數打包成數組,,調用數組參數函數,事實上你并不能同時聲明,say(string[])和say(params string[]),會提示已存在.在這里也能解釋為什么在既可變參,也可定參的情況下使用定參的原因了.使用變參需要額外的代碼打包參數.
轉載于:https://my.oschina.net/hunjixin/blog/517025
總結
以上是生活随笔為你收集整理的c# params 工作原理。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到蛇和鸡蛋预示着什么
- 下一篇: c# char unsigned_dll