nameof() 到底是编译时还是运行时行为?
生活随笔
收集整理的這篇文章主要介紹了
nameof() 到底是编译时还是运行时行为?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
咨詢區(qū)
Gigi:
在 C#6.0 中,可以用 nameof() 直接獲取變量或者類型的名字,請問這是一個 編譯時 還是 運行時 行為?
回答區(qū)
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 規(guī)格說明上也明確提到了,同時 TryRoslyn 也給了相應(yīng)的例子。
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);} }點評區(qū)
在 nameof 出現(xiàn)之前,要實現(xiàn)該功能只能用反射了,太難了,現(xiàn)在又多了一個選擇,C# 🐂👃。
總結(jié)
以上是生活随笔為你收集整理的nameof() 到底是编译时还是运行时行为?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可视化ASP.Net Core Web
- 下一篇: WPF实现拟物旋转按钮