Wersja 6.0 ma nową funkcję nameof
, ale nie rozumiem jej celu, ponieważ po prostu pobiera nazwę zmiennej i zmienia ją na ciąg znaków podczas kompilacji.
Myślałem, że może mieć jakiś cel podczas używania, <T>
ale kiedy próbuję, po nameof(T)
prostu drukuje mi T
zamiast używanego typu.
Masz pomysł na cel?
T
wcześniej uzyskać . Był sposób na uzyskanie używanego typu wcześniej.nameof
. Pomaga także zapobiegać literówkom.Odpowiedzi:
Co z przypadkami, w których chcesz ponownie użyć nazwy właściwości, na przykład podczas zgłaszania wyjątku na podstawie nazwy właściwości lub obsługi
PropertyChanged
zdarzenia. Istnieje wiele przypadków, w których chciałbyś mieć nazwę nieruchomości.Weź ten przykład:
W pierwszym przypadku zmiana nazwy
SomeProperty
zmieni również nazwę właściwości lub przerwie kompilację. Ostatni przypadek nie.Jest to bardzo przydatny sposób na utrzymanie kompilacji kodu i brak błędów (sortowanie).
( Bardzo fajny artykuł Erica Lipperta, dlaczego tego
infoof
nie zrobił, anameof
zrobił)źródło
nameof
i nazwa akcji zamiast łańcucha na stałe.public class MyController { public ActionResult Index() { return View(nameof(Index)); } }
- i możesz go używaćnameof
na elementach niestatycznych (na przykład możesz zadzwonić,nameof(MyController.Index)
używając klasy powyżej i wyemituje on „Indeks”). Sprawdź przykłady na msdn.microsoft.com/en-us/library/…Jest naprawdę przydatny
ArgumentException
i jego pochodne:Teraz, jeśli ktoś
input
zmieni nazwę parametru, wyjątek również będzie aktualizowany.Jest także przydatny w niektórych miejscach, w których wcześniej trzeba było zastosować odbicie, aby uzyskać nazwy właściwości lub parametrów.
W twoim przykładzie
nameof(T)
dostaje nazwę parametru typu - może to być również przydatne:Innym zastosowaniem
nameof
jest wyliczanie - zwykle jeśli chcesz, aby nazwa ciągu wyliczenia była używana.ToString()
:Jest to faktycznie stosunkowo wolne, ponieważ .Net przechowuje wartość wyliczania (tj.
7
) I znajduje nazwę w czasie wykonywania.Zamiast tego użyj
nameof
:Teraz .Net zastępuje nazwę wyliczenia ciągiem w czasie kompilacji.
Jeszcze inne zastosowanie to takie jak
INotifyPropertyChanged
logowanie i logowanie - w obu przypadkach chcesz, aby nazwa członka, do którego dzwonisz, została przekazana do innej metody:Lub...
źródło
typeof(T)
, który jest kolejnym kawałkiem cukru w czasie kompilacji, który jest przydatny w podobnych okolicznościach :-)nameofthismethod
. Możesz użyć,Log.Error($"Error in {nameof(DoSomething)}...")
ale jeśli skopiujesz i wkleisz to do innych metod, nie zauważysz, że nadal się do nich odnosiDoSomething
. Tak więc, chociaż działa idealnie z lokalnymi zmiennymi lub parametrami, nazwa metody stanowi problem.nameOf
użyje[DisplayName]
atrybutu, jeśli jest obecny? Naenum
przykład[DisplayName]
często używam z projektami MVCthrow new
jest zupełnie inny anty-wzorzec - znajdę nad wykorzystującychcatch
być częstym problemem z mniejszych deweloperów, ponieważ czuje się jak wyeliminować problem (gdy przez większość czasu to tylko ukrywanie go).Kolejny przypadek użycia, w którym
nameof
przydatna jest funkcja C # 6.0 - Rozważmy bibliotekę taką jak Dapper, która znacznie ułatwia pobieranie DB. Chociaż jest to świetna biblioteka, musisz wpisać twarde nazwy właściwości / pól w zapytaniu. Oznacza to, że jeśli zdecydujesz się zmienić nazwę swojej nieruchomości / pola, istnieje duże prawdopodobieństwo, że zapomnisz zaktualizować zapytanie w celu użycia nowych nazw pól. Dzięki interpolacji ciągów inameof
funkcjom kod staje się znacznie łatwiejszy w utrzymaniu i bezpieczny w użyciu.Z przykładu podanego w linku
bez nazwy
o nazwie
źródło
Twoje pytanie wyraża już cel. Musisz zobaczyć, że może to być przydatne do rejestrowania lub zgłaszania wyjątków.
na przykład.
to dobrze, jeśli zmienię nazwę zmiennej, kod zostanie uszkodzony lub zwróci wyjątek z niepoprawnym komunikatem .
Oczywiście zastosowania nie ograniczają się do tej prostej sytuacji. Możesz użyć,
nameof
ilekroć przydatne byłoby zakodowanie nazwy zmiennej lub właściwości.Zastosowania są różnorodne, gdy weźmie się pod uwagę różne sytuacje wiązania i refleksji. Jest to doskonały sposób na skompilowanie błędów, które były błędami w czasie wykonywania.
źródło
OnPropertyChanged
metod (które bezpośrednio akceptują nazwy właściwości zamiastPropertyChangedEventArgs
), lub wezwania do refleksji w celu wyszukania konkretnego członek czy typ?Najczęstszym przypadkiem użycia, jaki mogę wymyślić, jest praca z
INotifyPropertyChanged
interfejsem. (Zasadniczo wszystko związane z WPF i powiązaniami korzysta z tego interfejsu)Spójrz na ten przykład:
Jak widać po staremu, musimy przekazać ciąg znaków wskazujący, która właściwość uległa zmianie. Dzięki
nameof
możemy użyć nazwy nieruchomości bezpośrednio. To nie może wydawać się wielkim problemem. Ale wyobraź sobie, co się dzieje, gdy ktoś zmienia nazwę nieruchomościFoo
. Gdy użyjesz łańcucha, wiązanie przestanie działać, ale kompilator cię nie ostrzeże. Podczas używania nameof pojawia się błąd kompilatora, że nie ma właściwości / argumentu o nazwieFoo
.Zauważ, że niektóre frameworki używają magii odbicia, aby uzyskać nazwę właściwości, ale teraz mamy nazwę tego nie jest już konieczne .
źródło
[CallerMemberName]
atrybutu parametru nowej metody do wywołania tego zdarzenia.[CallerMemberName]string x = null
jest lepszy niżnameof(Property)
. Można powiedzieć, że nazwa właściwości jest używana dwukrotnie, ale w zasadzie jest to argument przekazany do funkcji. Chyba nie do końca to, co oznacza DRY :).nameof
jest to, że narzędzie do ustawiania właściwości wcale nie musi określać nazwy właściwości, co eliminuje możliwość kopiowania / wklejania błędów.INotifyPropertyChanged
, w której lepiej jest razem , używając[CallerMemberNameAttribute]
pozwala na czyste zgłoszenie zmiany z ustawiacza właściwości, anameof
składnia pozwala na czyste zgłoszenie zmiany z innej lokalizacji w kodzie.Najczęstszym zastosowaniem będzie sprawdzanie poprawności danych wejściowych, np
W pierwszym przypadku, jeśli byłaby sposób zmieniający PAR nazwę parametru, prawdopodobnie będziesz zapomnij zmienić w ArgumentNullException . Z imieniem nie musisz się tym martwić.
Zobacz także: nameof (C # i Visual Basic Reference)
źródło
Projekt ASP.NET Core MVC wykorzystuje
nameof
wAccountController.cs
iManageController.cs
zeRedirectToAction
sposobu odwołać akcję w kontrolerze.Przykład:
To przekłada się na:
i przenosi użytkownika do akcji „Indeks” w kontrolerze „Dom”, tj
/Home/Index
.źródło
return RedirectToAction(nameof(HomeController.Index), nameof(HomeController).Substring(nameof(HomeController),0,nameof(HomeController).Length-"Controller".Length));
?Jak już zauważyli inni,
nameof
operator wstawia nazwę nadaną elementowi w kodzie źródłowym.Chciałbym dodać, że jest to naprawdę dobry pomysł w zakresie refaktoryzacji, ponieważ sprawia, że refaktoryzacja łańcucha jest bezpieczna. Wcześniej korzystałem z metody statycznej, która korzystała z odbicia w tym samym celu, ale ma to wpływ na wydajność środowiska wykonawczego.
nameof
Operator ma wpływ na działanie środowiska wykonawczego; wykonuje swoją pracę w czasie kompilacji. Jeśli spojrzysz naMSIL
kod, znajdziesz ciąg osadzony. Zobacz następującą metodę i jej zdemontowany kod.Może to jednak stanowić wadę, jeśli planujesz zaciemnić oprogramowanie. Po zaciemnieniu osadzony ciąg może już nie pasować do nazwy elementu. Mechanizmy oparte na tym tekście się zepsują. Przykładami tego, w tym między innymi: Reflection, NotifyPropertyChanged ...
Określenie nazwy w czasie wykonywania kosztuje pewną wydajność, ale jest bezpieczne dla zaciemnienia. Jeśli zaciemnianie nie jest wymagane ani planowane, zaleciłbym użycie
nameof
operatora.źródło
Weź pod uwagę, że używasz zmiennej w kodzie i musisz uzyskać nazwę zmiennej, i powiedzmy, wydrukuj ją, powinieneś użyć
A jeśli ktoś zmieni kod i użyje innej nazwy dla „myVar”, będzie musiał obserwować wartość ciągu w twoim kodzie i odpowiednio ją chenge.
Zamiast tego, gdybyś miał
Pomoże to automatycznie refaktoryzować!
źródło
Type
, wartość i. Dzięki temu kod wywołujący metody rejestrowania może wyeliminować wiele nadmiarowości.Artykuł MSDN wymienia routing MVC (przykład, który naprawdę kliknął moją koncepcję) wśród kilku innych. (Sformatowany) akapit opisu brzmi:
Akceptowane / najwyżej oceniane odpowiedzi podają już kilka doskonałych konkretnych przykładów.
źródło
Cel
nameof
operatora jest podanie nazwy źródła artefaktów.Zwykle nazwa źródła jest taka sama jak nazwa metadanych:
Ale nie zawsze tak może być:
Lub:
Jednym z zastosowań, które mu nadałem, jest nazywanie zasobów:
Faktem jest, że w tym przypadku nawet nie potrzebowałem wygenerowanych właściwości, aby uzyskać dostęp do zasobów, ale teraz sprawdzam, czy zasoby istnieją.
źródło
Jednym ze sposobów użycia
nameof
słowa kluczowego jest programowe ustawienieBinding
w wpf .aby ustawić
Binding
musisz ustawićPath
ciąg, anameof
słowem kluczowym można użyć opcji Refaktoryzuj.Na przykład, jeśli masz
IsEnable
właściwość zależnościUserControl
i chcesz ją powiązaćIsEnable
z niektórymiCheckBox
z ciebieUserControl
, możesz użyć tych dwóch kodów:i
To oczywiste, że pierwszy kod nie może zostać zmieniony, ale ten zabezpieczający ...
źródło
Wcześniej używaliśmy czegoś takiego:
Powód - skompiluj bezpieczeństwo czasu. Nikt nie może po cichu zmienić nazwy właściwości i złamać logiki kodu. Teraz możemy użyć nameof ().
źródło
Ma to zaletę, gdy używasz ASP.Net MVC. Kiedy używasz pomocnika HTML do zbudowania kontroli, używa nazw właściwości w atrybucie nazwy danych wejściowych HTML:
To sprawia, że coś takiego:
Jeśli teraz chcesz zweryfikować swoją właściwość za pomocą metody Validate, możesz to zrobić:
W przypadku zmiany nazwy nieruchomości za pomocą narzędzi do refaktoryzacji weryfikacja nie zostanie naruszona.
źródło
Innym przykładem użycia
nameof
jest sprawdzenie stron kart, zamiast sprawdzania indeksu można sprawdzićName
właściwości stron kart w następujący sposób:Mniej bałaganu :)
źródło
Uważam, że
nameof
zwiększa to czytelność bardzo długich i złożonych instrukcji SQL w moich aplikacjach. To sprawia, że zmienne wyróżniają się z tego morza ciągów znaków i eliminuje zadanie polegające na ustaleniu, gdzie zmienne są używane w instrukcjach SQL.źródło