2016-09-10 32 views
5

我只是想知道如何從C#6來nameof,可以訪問非靜態屬性,就像它是靜態的。下面是一個例子工作名稱如何?

public class TestClass 
{ 
    public string Name { get; set; } 
} 

public class Test 
{ 
    public Test() 
    { 
     string name = nameof(TestClass.Name); // whats so speciall about nameof 
     //string name2 = TestClass.Name; this won't compile obviously, 
    } 
} 
+6

沒有什麼特別的。這發生在編譯時,而不是在運行時。編譯器沒有任何問題將名爲Name的成員轉換爲字符串文字「Name」。唯一奇怪的是它爲什麼需要將6個版本添加到該語言:) –

+0

你是什麼意思「nameof'工作如何?」爲什麼_不會工作?你是否有同樣的問題,例如'for','switch','return'等等?這些工作如何?編譯器是爲了理解它們,並在它看到它們時生成正確的編譯代碼。你在尋找編譯器如何工作的解釋嗎?然後,「太寬泛」。如果不是,那麼我不太瞭解你在問什麼。請解釋一下真正令你困惑的事情。 –

+0

你可能在這裏找到你的答案:http://stackoverflow.com/questions/31695900/what-is-the-purpose-of-nameof –

回答

8

這不是「訪問」的性質 - 即運營商純粹是一個編譯器機制注入了「名」的說法到代碼中。在這種情況下,它將用"Name"代替nameof(TestClass.Name)。它是非靜態的事實是無關緊要的。

+5

「它將用'」TestClass.Name「替換'nameof(TestClass.Name)'''不,它將用''Name''替換它。 – svick

+3

此外,'nameof'不能訪問私人成員,你的代碼不能正常工作,它會失敗,並且:「CS0122'AY'由於其保護級別而無法訪問」 – svick

+0

它的工作原理[here](http:// ideone .com/GG9VcU),但由於與問題無關,我將這部分內容取出。 –

3

nameof解釋器在compiletime解決,並翻譯爲static string
你的情況nameof(TestClass.Name)你只會返回"Name"作爲一個字符串。
您必須使用nameof(TestClass)
隨着nameof你可以在你的代碼減少冗餘(例如:你沒有使用nameof定義爲PROPERTYNAME或類似這樣的東西串

你也可以用它來代表一個類名,但可以。請注意!nameof(MyClass)
可能不一樣,在運行時,如果你有一個派生類! 運行時的目的使用typeOf.GetType()代替。

閱讀更多MSDN

相關問題