日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c# params 工作原理。

發布時間:2023/11/29 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 工作原理。的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。