c# params 工作原理。
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
高級(jí)語言之所以成為高級(jí)語言,編譯器付出了很多。params在給我們帶來方便的同時(shí),編譯器也是貢獻(xiàn)不少。
實(shí)例代碼:
using?System; public?class?Test { public?static?void?Main(){????Console.WriteLine("結(jié)果1"); say("hello","world");Console.WriteLine("結(jié)果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");是為了驗(yàn)證在參數(shù)同時(shí)適配
public?static?void?say(string?str,string?str2) public?static?void?say(params?string[]?str)的時(shí)候,編譯器是調(diào)用哪個(gè)函數(shù)。
??say("aaaa","sssss","ddddd");是為了察看params的運(yùn)作過程
代碼結(jié)果:
分析:
從結(jié)果1可看出在同時(shí)符合確定變量和可變變量的時(shí)候,編譯器調(diào)用的是確定變量的函數(shù),至于原因等說完params在提。
反編譯這段代碼。
注意參數(shù),這里并沒有出現(xiàn)params字樣,說明到這個(gè)層級(jí)是不存在params了,接著看main函數(shù)。
.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)???????????????????????????????????????????????????????//?結(jié)果1的調(diào)用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[])???????????????????????????????????????//結(jié)果2的調(diào)用IL_0048:??call???????valuetype?[mscorlib]System.ConsoleKeyInfo?[mscorlib]System.Console::ReadKey()IL_004d:??popIL_004e:??ret }?//?end?of?method?Test::Main從結(jié)果1可以清楚地看到調(diào)用的是確定參數(shù)函數(shù),往下的IL_0024構(gòu)建了一個(gè)數(shù)組,然后在一個(gè)個(gè)的把參數(shù)推送進(jìn)數(shù)組,最后調(diào)用了say(string[] )函數(shù).
結(jié)論:?
params的實(shí)現(xiàn)只是將單個(gè)的參數(shù)打包成數(shù)組,,調(diào)用數(shù)組參數(shù)函數(shù),事實(shí)上你并不能同時(shí)聲明,say(string[])和say(params string[]),會(huì)提示已存在.在這里也能解釋為什么在既可變參,也可定參的情況下使用定參的原因了.使用變參需要額外的代碼打包參數(shù).
轉(zhuǎn)載于:https://my.oschina.net/hunjixin/blog/517025
總結(jié)
以上是生活随笔為你收集整理的c# params 工作原理。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到蛇和鸡蛋预示着什么
- 下一篇: Project facet Dynami