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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nameof() 到底是编译时还是运行时行为?

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nameof() 到底是编译时还是运行时行为? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

咨詢區

  • Gigi

在 C#6.0 中,可以用 nameof() 直接獲取變量或者類型的名字,請問這是一個 編譯時 還是 運行時 行為?

回答區

  • Faris Zacina

可以肯定的說,它是一種 編譯時 行為,我舉一個例子,參考如下代碼:

static?void?Main(string[]?args){var?firstname?=?"Gigi";var?varname?=?nameof(firstname);Console.WriteLine(varname);Console.ReadLine();}

程序跑起來后,我們觀察一下它的 MSIL 代碼。

.method?private?hidebysig?static?void?Main?(string[]?args)?cil?managed? {//?Method?begins?at?RVA?0x2050//?Code?size?27?(0x1b).maxstack?1.entrypoint.locals?init?([0]?string?firstname,[1]?string?varname)IL_0000:?nopIL_0001:?ldstr?"Gigi"IL_0006:?stloc.0IL_0007:?ldstr?"firstname"IL_000c:?stloc.1IL_000d:?ldloc.1IL_000e:?call?void?[System.Console]System.Console::WriteLine(string)IL_0013:?nopIL_0014:?call?string?[System.Console]System.Console::ReadLine()IL_0019:?popIL_001a:?ret }?//?end?of?method?Program::Main

從上面的 MSIL 代碼中,可以清晰的看到, nameof(firstname) 變成了 ldstr "firstname", 也就是說是將字符串 firstname 推送到計算堆棧上。

  • i3arnon

是的, nameof() 它是一種編譯器行為,其實 ?C# spec 規格說明上也明確提到了,同時 TryRoslyn 也給了相應的例子。

public?class?Foo {public?void?Bar(){Console.WriteLine(nameof(Foo));} }

編譯之后會變成這樣。

public?class?Foo {public?void?Bar(){Console.WriteLine("Foo");} }

這里簡單提一下,如果想要在運行時獲取類似的行為怎么處理呢?可以用反射哈。

public?class?Foo {public?void?Bar(){Console.WriteLine(typeof(Foo).Name);} }

點評區

在 nameof 出現之前,要實現該功能只能用反射了,太難了,現在又多了一個選擇,C# 🐂👃。

總結

以上是生活随笔為你收集整理的nameof() 到底是编译时还是运行时行为?的全部內容,希望文章能夠幫你解決所遇到的問題。

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