Jak się dowiedzieć, czy nasz kod działa wolno i przydałoby się go przyśpieszyć? Często opieramy się na naszej wiedzy, doświadczeniu oraz intuicji. Innym razem dostajemy uwagi od naszego zespołu podczas code review. Albo po prostu widzimy, że aplikacja się wlecze, jak czas pracy w poniedziałek. Nie zawsze jednak uda nam się to dostrzec, bo my ludzie, mamy spowolnioną percepcję, która nie nadąża za obliczeniami komputera. Łatwo zauważymy różnicę sekund, ale z mniejszymi wartościami, już sobie nie radzimy. Z pomocą może przyjść BenchmarkDotNet. Bo dobrze by było móc zobaczyć wyniki prędkości kodu. Tak by mieć liczby przed oczami i móc porównać czasy. Moglibyśmy wtedy sprawdzić ilokrotnie dany kod wykonujący tą samą czynność…
-
-
Parametry w Dapperze
W poprzednim wpisie na temat Dappera, który możecie przeczytać tutaj, opisałem jego podstawowe właściwości oraz przedstawiłem, w jaki sposób możecie z niego skorzystać, aby wykonać najprostsze operacje bazodanowe. Czyli w skrócie znajdziecie tam, jak zrobić całego CRUDa. No i w zasadzie, jest to kwintesencja tego narzędzia, lecz nie wszystko, co warto o nim wiedzieć. W tym artykule wyjaśnię, w jaki sposób można połączyć dane z SQL-owymi zapytaniami korzystając z Dappera. Statyczne zapisanie wartości Gdy znamy wartości poszczególnych elementów możemy zapisać je bezpośrednio w zapytaniu. Przykładowo, gdy chcemy pobrać użytkowników, którzy nie są usunięci (a w zasadzie zarchiwizowani), to wskazujemy w warunku zapytania na to przez podanie odpowiedniej wartości. To zapytanie…
-
Zmiana automatycznie generowanych namespace’ów podczas tworzenia klas w Visual Studio
Programiści .NET nieustannie widzą taki o to zestaw namespace’ów w swoich klasach: Lub ewentualnie taki: Są one dodawane automatycznie za każdym razem, gdy jest tworzona klasa C# z poziomu Visual Studio. W zależności od wersji platformy .NET wygenerowany zostanie odpowiedni szablon (nowej klasy) z domyślnie ustalonymi przestrzeniami nazw. Dodawane są te namespace’y, które uważane są za najbardziej popularne. Tylko, że nie są one dodawane przez nas, a narzucane z góry. A co jeżeli chcielibyśmy to zmienić? Czy można dodać swoje przestrzenie nazw, a może w ogóle się ich pozbyć? Zmiana szablonu Aby je zmienić należy zmodyfikować szablon, na podstawie którego zostaje wygenerowana klasa. W zależności od posiadanej przez nas wersji…
-
Dostęp do informacji elementu wywołującego, czyli Caller Info – Język C#
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ę…
-
Tworzenie kopii obiektów przez MemberwiseClone oraz ICloneable – Język C#
Przypisanie istniejącego obiektu do innej zmiennej niesie ze sobą pewne ryzyko. Należy być świadomym, czym różni się i co zawiera w sobie typ referencyjny, a co typ wartościowy. O typach wartościowych pisałem już nieco podczas omawiania struktur, w tym materiale. Tam też przedstawiłem problem przypisywania typów referencyjnych do innej zmiennej, który zaraz przypomnę. Przypisywanie typów wartościowych Jak sama nazwa wskazuje typy te zawierają w sobie wartość, która zostaje im przypisana. Stwórzmy w naszym testowym przykładzie zwykłą strukturę reprezentującą punkt na płaszczyźnie 2D: Punkt taki składa się z dwóch właściwości, jedna wskazuje położenie w poziomie, a druga w pionie (takie małe przypomnienie ze szkoły). Teraz utwórzmy obiekt naszej struktury, czyli punkt,…
-
Operacje CRUD – EF Core
W poprzednim wpisie, dotyczącym EF Core, pokazałem jak utworzyć prostą bazę danych składającą się z jednej tabeli w podejściu Code First. Jednak baza danych do czegoś służy, a nie wegetuje sobie gdzieś. Dzisiaj wykonamy na niej proste operację CRUD, czyli dodamy element (Create), wczytamy go z bazy danych (Read), zmodyfikujemy jego zawartość (Update) oraz usuniemy z bazy danych (Delete). CRUD jest oczywiście akronimem od tych wszystkich operacji. Do tej pory z cyklu poradników o EF ukazały się: Tworzenie bazy danych w podejściu Code First – EF Core Przypomnienie Trochę przypomnienia z poprzedniego wpisu, żebyście nie musieli weryfikować go od nowa. Operujemy na tabeli detektywa, określonego przez klasę: a nasza baza…
-
Tworzenie bazy danych w podejściu Code First – EF Core
Podejście Code First polega na utworzeniu modelu danych za pomocą klas języka C#. Utworzona klasa będzie reprezentowała tabelę bazy danych, a zawarte w niej właściwości (ang. property) będą odzwierciedlały kolumny tabeli. Na podstawie wskazanych klas, które mają być zawarte w bazie danych, EF Core wygeneruje odpowiednie tabele. W tym wpisie pokażę jak utworzyć prostą bazę danych składającą się z jednej tabeli reprezentującą encję detektywów. Na początek wybieram projekt. Będzie to zwyczajna aplikacja konsolowa w Core: Teraz stworzę model danych w postaci klasy POCO (Plain Old CLR Objects). Jest to prosta klasa, odzwierciedlająca dany byt, która później zostanie zamieniona na tabelę bazy danych. Tutaj będzie to tabela detektywów. Zauważcie, że model…
-
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…