C# 6.0 – nowości – słowo kluczowe „nameof”

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:

nameof

Słówko kluczowe nameof nie działa przy typach prostych i przy wyrażeniu this.

nameof_2

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.

 

 

5 przemyśleń nt. „C# 6.0 – nowości – słowo kluczowe „nameof”

  1. 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ę.

  2. Do logowania metoda MethodBase.GetCurrentMethod() jest kiepska – jest strasznie wolna – jesli juz musimy logowac to prawdopodbnie lepiej wykorzystac jakis framework aop.

  3. Świetnie się przyda przy ORMach oraz innych frameworkach, które wymagają bindowania po przez wpisywania właściwości z palca

  4. Do logowania lepszym rozwiązaniem nadal pozostaje funkcja:
    MethodBase.GetCurrentMethod()
    Dzięki niej możemy pobrać nie tylko nazwę funkcji ale też parametry.

Możliwość komentowania jest wyłączona.