Caller Info jest to zestaw atrybutów, dostępnych pod przestrzenią nazw (ang. namespace) System.Runtime.CompilerServices, pozwalających na uzyskanie informacji na temat elementu wywołującego metodę, opatrzoną tymi atrybutami. Metoda wywołująca, której dane pozyskujemy nazywa się z ang. caller. Mechanizm został wprowadzony w wersji 5.0 języka C#. Caller Informaton pozwala na pobranie informacji o: Nazwie elementu wywołującego (np. nazwie metody), za pomocą atrybutu CallerMemberNameAttribute. Nazwy pliku w którym znajduje się caller, za pomocą atrybutu CallerFilePathAttribute. Numerze linijki w kodzie, gdzie znajduje się element wywołujący, za pomocą atrybutu: CallerLineNumberAttribute. Utworzymy teraz praktyczny przykład pokazujący jak działają te atrybuty w praktyce. Na początku stworzymy oddzielny plik gdzie będzie znajdowała się metoda korzystająca z atrybutów Caller Info:…
-
-
Przestarzałe części kodu i atrybut Obsolete – Język C#
Przy tworzeniu oprogramowania niemal zawsze trzeba coś zmieniać. Może to być spowodowane sprawami wewnętrznymi, takimi jak nasze (bądź teamu) widzimisie w stosunku do projektu oraz tymi zewnętrznymi. A to klient/konsument będzie chciał coś zmienić, a to regulacje prawne ulegną przemianie i będzie trzeba dostosowywać aplikację do obowiązujących przepisów, albo znajdzie się jeszcze coś innego. Czasami jednak nie będziemy mogli nawet zmodyfikować naszej cześci aplikacji od tak, modyfikując istniejący kawałek kodu, bo: Wymagało by to większego pokładu czasu oraz wysiłku niż stworzenie komponentu od nowa. Złamalibyśmy drugą zasadę SOLID open/closed principle, która jasno mówi, że kod powinien być zablokowany na modyfikację, a otwarty na rozszerzenia. Z naszego systemu korzystają inni programiści,…
-
Płytkie (shallow) oraz głębokie (deep) kopiowanie – Język C#
Kontynuuję artykuł na temat tworzenia kopii obiektów referencyjnych. We wcześniejszym wpisie, który możecie znaleźć tutaj, zaprezentowałem jak działa metoda MemberwiseClone oraz interfejs ICloneable, ale czy na pewno wszystko zostało powiedziane? Płytkie kopiowanie (ang. shallow copy) W poprzednim materiale nie bez powodu badanym obiektem był punkt, składający się z dwóch typów wartościowych: X oraz Y. Tym razem będzie trochę inaczej, bo utworzymy obiekt zawierający typy referencyjne. W przykładzie mamy klasę detektywa, który ma do wykonania pewne zadanie. Będzie ono składać się z identyfikatora oraz zmiennej tekstowej określającej co należy zrobić. Sklonujmy teraz detektywa i zmienimy pewne wartości. Po uruchomieniu przykładu zobaczymy: Nie wyszło jednak tak, jak chcieliśmy. Imiona detektywów pokazały się…
-
Struktury w języku C#
Tworzenie i wykorzystywanie struktur jest bardzo podobne do operowania na klasach, jednak to te drugie są częściej wykorzystywane w codziennej pracy programisty. Nie każdy jednak wie, że struktury wykorzystuje niemal bez przerwy, a zaczyna już na starcie nauki programowania w języku C#, zaraz po napisaniu aplikacji typu Hello World. Dziś przedstawię Wam pojęcie struktury i różnicę pomiędzy nimi, a klasami. Pojęcie Struktura– jest to typ wartościowy, co oznacza, że wartości są przechowywane bezpośrednio w zmiennej. Podczas definiowania zmiennej system rezerwuje odpowiednią ilość miejsca w pamięci, a wartość która zostanie jej przypisana ląduje bezpośrednio do tego obszaru pamięci. Inaczej działa to w typach referencyjnych, do których zalicza się klasa. Tam zmienna…
-
Nie dziedzicz tego, czyli modyfikator sealed w języku C#
Głównym fundamentem języków zorientowanych obiektowo jest dziedziczenie. Pozwala ono na zachowanie pewnych właściwości rodzica, tych które są publiczne (ang. public) oraz chronione (ang. protected). Dzięki temu programista tworzący podklasę, nie musi za każdym razem tworzyć wspólnych właściwości i innych elementów. Co jednak, jeżeli uważamy, że po naszej klasie inna klasa nie powinna już więcej dziedziczyć? Że to nasza klasa osiąga największą szczegółowość, a tworzenie po niej klasy pochodnej oznacza, że ktoś tutaj nie zrozumiał naszego punktu widzenia? Na ratunek przychodzi nam modyfikator sealed. Jest to słowo kluczowe wstawiane w definicji naszej klasy przed słówkiem class. Oznacza to, że żadna inna klasa nie może dziedziczyć po klasie sealed. Swoją drogą sealed…
-
Walidacja danych za pomocą DataAnnotations
Wprowadzę sobie PESEL o długości 15 znaków, a co, niech programiści sobie if’ują! W wielu projektach, jak nie w każdym, zachodzi konieczność sprawdzenia, czy dane pole spełnia określone reguły narzucone przez potrzeby biznesowe, czy po prostu przez zdrową ludzką logikę. W prostych przypadkach dozwolony zakres danych narzucony jest przez typy zmiennych w typowanym języku programowania, jakim jest np. C#. Przez to nie możemy przypisać dowolnego tekstu do zmiennej całkowitoliczbowej. Co jednak jeżeli chcielibyśmy narzucić bardziej złożone ograniczenie, czy wtedy wszystko musimy sprawdzać ręczenie? W tym wpisie przedstawię, czym jest DataAnnotations oraz gdzie znajduje zastosowanie przy budowaniu aplikacji internetowych w ASP.NET (MVC, czy też Core). Co to DataAnnotations? Data Annotations…
-
ModelState, czyli wstępna walidacja w ASP.NET Web Api
ASP.NET dostarcza nam mechanizmu wstępnej walidacji danych (sprawdzenia czy dane są poprawne), które są przesyłane w żądaniu. Programista nie musi ręcznie sprawdzać czy dane pole nie ma wartości pustej, czy długość ciągu znaków nie przekracza narzuconego limitu, bądź czy liczba mieści się w dozwolonym zakresie. Wystarczy, że użyje techniki opisanej poniżej, która jednocześnie jest bardzo prosta w użyciu. Poniższy przykład został stworzony w ASP.NET Core 2.1 Web Api. Zanim zaczniemy, będziemy potrzebować modelu danych, który pomoże zrozumieć zagadnienie. Dobrym przykładem będzie stworzenie klasy związanej z człowiekiem, dlatego też utworzymy detektywa. Detektyw posiada trzy właściwości, jednak nie mają one jeszcze sprecyzowanej dziedziny (co mogą zawierać, a co nie). Żeby dodać…
-
Pudełkowanie (boxing) oraz odpakowywanie (unboxing) w języku C#
Nadszedł czas na wpis, do którego został stworzony ten blog, czyli na coś związanego z programowaniem. Na start opisze tutaj, czym jest mechanizm opakowania (lub pudełkowania) w C#. Zapraszam do czytania. W języku C# wszystkie klasy dziedziczą po System.Object, klasie która jest położona najwyżej w hierarchii dziedziczenia. Za sprawą polimorfizmu, jednego z fundamentalnych założeń programowania zorientowanego obiektowo, można potraktować każdy obiekt dowolnej klasy właśnie jako typ object. Ponieważ nasz utworzony byt w uogólnieniu jest też object-em (bo po nim zawsze dziedziczy). Warto tutaj zaznaczyć, że object jest tym samym, co klasa System.Object. Co jednak, gdy chcielibyśmy w taki sam sposób zamienić podstawowy typ, np. int na typ…