2016-09-10 16 views
5

Zastanawiam się, jak to możliwe, że imię pochodzące z C# 6 może uzyskać dostęp do właściwości niestatycznych, tak jakby było statyczne. Oto przykładJak działa 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

Nie ma w tym nic specjalnego. Dzieje się to podczas kompilacji, a nie w czasie wykonywania. A kompilator nie ma problemu z przekształceniem elementu o nazwie Name w literał łańcuchowy "Name". Jedyne, co jest dziwne, to dlaczego do wersji dodano 6 wersji językowych :) –

+0

Co masz na myśli "jak działa' nameof'? " Dlaczego _nie to by działało? Czy masz takie samo pytanie dla np. 'for',' switch', 'return', itp.? Jak _any_ z tych osób działa? Kompilator jest napisany, aby je zrozumieć i wygenerować poprawny skompilowany kod, gdy je zobaczy. Szukasz wyjaśnienia działania kompilatorów? Następnie "zbyt szeroki". Jeśli nie, to tak naprawdę nie rozumiem, o co pytasz. Wyjaśnij, co naprawdę cię zastanawia. –

+0

możesz znaleźć swoją odpowiedź tutaj: http://stackoverflow.com/questions/31695900/what-is-- -funkcjonowanie-nazwa –

Odpowiedz

8

To nie „dostępu” właściwość - że operator jest wyłącznie mechanizm kompilatora do wstrzyknąć „nazwa” argumentu w kodzie. W takim przypadku zastąpi on nameof(TestClass.Name) przez "Name". Fakt, że jest niestatyczny, nie ma znaczenia.

+5

"zastąpi' nameof (TestClass.Name) 'z' "TestClass.Name" '" Nie, zastąpi go po prostu '" Name "'. – svick

+3

Ponadto, 'nameof' nie może uzyskać dostępu do prywatnych członków, twój kod nie działa poprawnie, kończy się niepowodzeniem:" CS0122 "AY" jest niedostępne ze względu na poziom ochrony " – svick

+0

Dobrze działa [tutaj] (http: // ideone .com/GG9VcU), ale wziąłem tę część, ponieważ nie ma to znaczenia dla pytania. –

3

nameof Tłumacz ustąpił przy compiletime i zamiast tego przetłumaczył na static string.
W twoim przypadku nameof(TestClass.Name) zwrócisz tylko "Name" jako ciąg znaków.
Musisz użyć nameof(TestClass).
Z nameof można zminimalizować redundancję w kodzie (np. Nie trzeba zdefiniować ciąg dla PROPERTYNAME lub coś takiego za pomocą nameof

Można również użyć go do reprezentowania nazwy klas, ale być. świadomy! nameof(MyClass)
nie może być taka sama jak w czasie wykonywania, jeśli masz klasę pochodną! celach uruchomieniowe używać typeOf lub .GetType() zamiast.

Czytaj więcej na MSDN