Dołączę do grona piszących o nowościach w C# 6. Jedną z nich jest słowo kluczowe „nameof”. Po zainstalowania Visual Studio 2015 (do czego gorąco zachęcam) będzie można je sprawdzić w praktyce. Nameof zwraca w postaci stringa nazwę argumentu, który przekazujemy do metody nameof.
Na początek praktyczny przykład zastosowania tego słówka kluczowego w WPF-ie.
Podczas bindowania właściwości z zastosowaniem interfejsu INotifyPropertyChanged musimy do obiektu PropertyChangedEventArgs przekazać nazwę właściwości, którą chcemy przekazać do formatki WPF-owej.
Najprostszy przykład pokazujący bindowanie wygląda tak
class Class1 : INotifyPropertyChanged { private string _test; public event PropertyChangedEventHandler PropertyChanged; public string Test { get { return _test; } set { _test = value; RaisePropertyChanged("Test"); } } protected void RaisePropertyChanged(string propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } }
W linijce 16 widzimy przekazanie nazwy argumentu w postaci stringa.
Dzięki nameof możemy to zrobić w bardziej bezpieczny i przejrzysty sposób.
RaisePropertyChanged(nameof(Test));
Zmiana niewielka ale robi różnicę.
Dzięki temu możemy uniknąć nie porozumienia w postaci literówki w zapisie właściwości oraz kod jest czytelniejszy, ponieważ szybko można zrozumieć intencję autora, który przesyła stringa do metody.
Jeśli chodzi o inne obiekty to nie zauważyłem jeszcze żadnych niespodzianek.
namespace ConsoleCSharp6 { class Program { public static string Test { get; set; } = "Przykład"; static void Main(string[] args) { WriteLine("Name of namespace: {0}", nameof(ConsoleCSharp6)); WriteLine("Name of class: {0}", nameof(Program)); WriteLine("Name of object: {0}", nameof(StringBuilder)); WriteLine("Name of method: {0}", nameof(Method)); WriteLine("Name of struct: {0}", nameof(DateTime)); WriteLine("Name of field: {0}", nameof(Test)); ReadKey(); } static void Method() { } } }
Rezultat:
Słówko kluczowe nameof nie działa przy typach prostych i przy wyrażeniu this.
Nie wyobrażam jednak sobie sensu użycia takiej składni jednak warto było sprawdzić.
Podsumowując słówko kluczowe nameof jest użyteczne i może trochę ułatwić analizę kodu.
Osobiście uważam, że może sie przydać w czasie logowania. Można będzie szybko przesłać nazwę metody do logów.
Jedna, bardzo ważna rzecz tutaj się nie pojawiła – nameof jest „compile time”. To już mówi wszystko :) Jaka będzie wydajność oraz jakie będą ograniczenia. Operator ten będzie również pomocny podczas generowania wyjątków, np. ArgumentNullException, do których przekazujemy „paramName”. Do tej pory trzeba było samemu napisać stringa z nazwą parametru lub nazwy property, gdzie łatwo było o pomyłkę.
Do logowania metoda MethodBase.GetCurrentMethod() jest kiepska – jest strasznie wolna – jesli juz musimy logowac to prawdopodbnie lepiej wykorzystac jakis framework aop.
Świetnie się przyda przy ORMach oraz innych frameworkach, które wymagają bindowania po przez wpisywania właściwości z palca
Do logowania lepszym rozwiązaniem nadal pozostaje funkcja:
MethodBase.GetCurrentMethod()
Dzięki niej możemy pobrać nie tylko nazwę funkcji ale też parametry.
Faktycznie celna uwaga.