Zauważyłem, że czasami programiści używają Debug.WriteLine, aby wyświetlić jakieś informacje w oknie output: Debug.WriteLine("Jakies informacje."); Nie ma w tym nic złego, ale czasami dodawana jest powyższa linia tylko tymczasowo, aby ułatwić sobie debugowanie (szczególnie aplikacji wielowątkowej). Visual Studio pozwala osiągnąć ten sam efekt, za pomocą zwykłego breakpoint’a. Wystarczy najpierw ustawić breakpoint (naciskamy F9), a potem kliknąć na nim i wybrać When Hit: Zostanie otworzone nowe ok...
Strona głównaUżytkownik
pzielinski | użytkownik
Kilka dni temu opisywałem jak w VS 2008 debugować kod .NET Framework i obiecywałem sprostowanie do wersji 2012. Z tego co udało mi się dowiedzieć, temat nie jest zbyt jasny ale wygląda na to, że: 1. W niektórych wersjach VS2010 działało to ale potem znów zostało popsute. 2. W VS2012 funkcja nie działa. Jeśli komuś udało się to uruchomić pod VS 2012, proszę o komentarz pod wpisem. Link do Microsoft Connect, opisujący bug: http://connect.microsoft.com/VisualStudio/feedback/details/697947/net-framewo...
W ostatnim wpisie pokazałem jak debugować kod .NET Framework w VS2008. Wciąż próbuje wyjaśnić w jakich wersjach to działa a w jakich nie. W następnym wpisie mam nadzieję, że wspomnę jak sprawa wygląda z VS 2010 i VS2012. Wątki w aplikacjach są dziś już nieodłącznym elementem. Wprowadzenie async\await jeszcze bardziej upowszechniło i ułatwiło pisanie kodu wykonywanego równolegle. W przypadku, gdy aplikacja wielowątkowa zachowuje się podejrzanie, znalezienie błędu może być bardzo trudnym wyzwaniem. Visual...
Czasami nasz kod nie działa i chcielibyśmy sprawdzić jak działa dokładnie funkcja dostarczona przez .NET Framework. Oczywiście domyślnie nie możemy tego zrobić – po kliknięciu Step Into, przejdziemy po prostu do kolejnej metody. Poniższy opis dotyczy Visual Studio 2008, na którym testowałem i faktycznie działa to. Niestety wciąż mamy problemy z VS 2012 – w następnym wpisie postaram się dać jakiś update odnośnie 2012. W VS mamy coś takiego jak source server oraz możemy również ściągnąć symbols files dla...
Przed przeczytaniem tego postu zachęcam do zapoznania się następującymi wpisami: 1. Typ dynamic w C# 4.0 2. Zastosowanie dynamic: ExpandoObject 3. Zastosowanie dynamic: DynamicObject ExpandoObject to przydatna czasami klasa, ale problem z nią taki, że nie można jej rozszerzać i nawet została oznaczona jako sealed. Aby skorzystać z klasy Gemini, najpierw należy zainstalować odpowiedni pakiet z NuGet: Zacznijmy od przykładu pokazującego, że faktycznie można po Gemini dziedziczyć:internalclass Progr...
Sztuka programowania 4128 dni, 18 godzin, 18 minut temu 332 źrodło rozwiń
Kolejna część artykułu o Enterprise Library i wykonywaniu logów: http://msdn.microsoft.com/pl-pl/library/enterprise-library-logging-application-block–czesc-2.aspx Zapraszam do lektury!Explore posts in the same categories:Ogólne, Patterns & Practices This entry was posted on Wednesday, August 21st, 2013 at 7:47 pm and is filed under Ogólne, Patterns & Practices. You can subscribe via RSS 2.0 feed to this post's comments. ...
Sztuka programowania 4131 dni, 16 godzin, 32 minuty temu 111 źrodło rozwiń
Dzisiaj króciutki przykład:class ItemInfo
Sztuka programowania 4133 dni, 8 godzin, 40 minut temu 230 źrodło rozwiń
Ostatnio potrzebowałem użyć Border z CornerRadius ustawionym na jakąś wartość, aby móc potem umieścić w środku inne kontrolki (np. obrazek). Moje pierwsze podejście było następujące: Niestety w taki sposób zawartość Border nie zostanie poprawnie przycięta i efekt jest następujący: Znalazłem na forum bardzo ciekawe rozwiązanie z użyciem OpacityMask. Najpierw kod a potem wyjaśnienie: Efekt: Aby zrozumieć powyższy kod należy najpierw wyjaśnić jak działa OpacityMask. OpacityMask to brush, który o...
W zdecydowanej większości przypadków jestem przeciwnikiem singleton’a i uważam to za anty-wzorzec. Dużo lepiej użyć IoC i przekazywać wszędzie w konstruktorach tą samą instancję. Istnieją jednak przypadki, w których użycie singleton’a nie jest brzydkie. Ostatnio miałem klasę, która potrzebowała pewnych danych – kolekcję prostych struktur. Każda struktura zawiera string i pole bool. Ze względu, że ta kolekcja musi być wykorzystana w kilku klasach, zdecydowałem się na przeniesienie jej do osobnej klasy (s...
Sztuka programowania 4140 dni, 19 godzin, 37 minut temu 256 źrodło rozwiń
Dzisiejszy wpis dotyczy wszystkich klas, jednak zostanie on zaprezentowany na przykładzie ViewModel znanego z MVVM. W moim projekcie używam MVVM i dlatego jest to dla mnie naturalne. W poście zaprezentuje bardzo sztuczne przykłady, dlatego proszę nie skupiać się na nazewnictwie czy na zaprezentowanej funkcjonalności. Przedstawiony problem jest jednak bardzo częsty w realnych projektach i sam mam\miałem z nim do czynienia w codziennej pracy. Powiedzmy, że napisaliśmy ViewModel prezentujący jakąś część ...
Sztuka programowania 4142 dni, 14 godzin, 50 minut temu 284 źrodło rozwiń
Często można usłyszeć, że przypisania są zawsze bezpieczne w wielowątkowości i powinniśmy martwić się np. inkrementacją. Jest to prawda dla Int32 ale dla long już nie zawsze. Przykład:internalclass Program { privatestaticlong _x =0; privatestaticvoid Main(string[] args) { Task.Factory.StartNew(Task1); Task.Factory.StartNew(Task2); Thread.Sleep(5000); } privatestaticvoid Task2() { while (true) { Console.WriteLine(_x); } } privat...
Sztuka programowania 4145 dni, 17 godzin, 44 minuty temu 137 źrodło rozwiń
W poprzednich wpisach omawialiśmy wewnętrzną implementację async\await. Dziś kolejne przykłady pokazujące, czego należy unikać aby optymalizować nasz kod. Jak wiemy, użycie await generuje masę kodu i niesie ze sobą alokację dodatkowych obiektów – maszyna stanów, wątki, wrappery itp. W zasadzie sama alokacja w .NET nie jest jakiś wielkim problemem i jest znacząco szybsza niż w językach niezarządzanych. Niestety, pomimo wielu optymalizacji dokonywanych przez GC, późniejsze ich zwolnienie jest czasochłonn...
Sztuka programowania 4148 dni, 19 godzin, 39 minut temu 117 źrodło rozwiń
Zacznijmy od synchronicznego kodu:internalclass Program { privatestaticvoid Main(string[] args) { ShortMethod1(); ShortMethod2(); ShortMethod3(); } privatestaticvoid ShortMethod1() { Console.WriteLine("1"); } privatestaticvoid ShortMethod2() { Console.WriteLine("2"); } privatestaticvoid ShortMethod3() { Console.WriteLine("3"); } } Mamy powyżej przykład 3 metod, które wykonują bardzo proste operacje. Nie są one zbyt skompl...
Sztuka programowania 4151 dni, 17 godzin, 54 minuty temu 80 źrodło rozwiń
Zanim przejdziemy do pokazania przykładów jak optymalizować async\await najpierw trzeba zrozumieć implementację wewnętrzną w .NET. Bez tego ciężko będzie cokolwiek optymalizować. Na początku async\await wydawał mi się również czymś niezwykłym, a jak zacząłem zagłębiać się w kod IL, okazało się, że to bardzo prosty mechanizm i mógłby być napisany przez każdego z nas. Kod korzystający z async\await wygląda na synchroniczny. Pod spodem jednak są zwykłe callback’i – dokładnie tak jakby było to napisane w po...
Sztuka programowania 4154 dni, 12 godzin, 16 minut temu 163 źrodło rozwiń
W kolejnych kilku wpisach, zajmiemy się async\await ale od strony wydajnościowej. Jeśli ktoś nie wie do czego te słowa kluczowe służą, zachęcam przeczytać np. mój artykuł o programowaniu asynchronicznym w .NET 4.5. Sposób korzystania z async\await jest bardzo prosty. Do tego stopnia, że programowanie asynchroniczne wygląda w zasadzie tak jak synchroniczne podejście. W kodzie nie ma callback’ow a przepływ logiki wygląda na sekwencyjny. Niestety, trzeba być świadomym jakie pułapki czekają na programistów...
Sztuka programowania 4157 dni, 16 godzin, 43 minuty temu 288 źrodło rozwiń
Dzisiaj na szybko wrócimy z powrotem do tematu TPL Data Flows. Jakiś czas temu pisałem o różnych blokach w TPL DataFlows. Nie opisałem jednak TransformManyBlock. TransformManyBlock jest analogiczny do TransformBlock z tym, że na wyjściu jest kolekcja więc możliwe jest zwrócenie kilku wartości. TransformBlock służył wyłącznie do przetworzenia parametru i zwrócenia pojedynczego wyniku. Ktoś może zapytać, czy to nie to samo co przekazanie jako typu generycznego IEnumerable do TransformBlock – też wtedy na...
Sztuka programowania 4159 dni, 7 godzin, 40 minut temu 47 źrodło rozwiń
W sprawie wydajności wyjątków można znaleźć wiele opinii, często sprzecznych ze sobą. W dzisiejszym wpisie przedstawię kilka programików, mających na celu, wyjaśnienie jaki wpływ mają wyjątki oraz ich łapanie na wydajność aplikacji. Zacznijmy od przykładów a potem przejdziemy do analizy wyników. Kod z wyrzucaniem wyjątków: internalclass Program { privatestaticvoid Main(string[] args) { constint n =20000; Stopwatch stopwatch = Stopwatch.StartNew(); for (int i =0; i < n;="" i+...
Sztuka programowania 4162 dni, 19 godzin, 24 minuty temu 285 źrodło rozwiń
Visual Studio 2012 ma wsparcie dla nUnit. Wcześniej wspierał oficjalnie wyłącznie własne testy jednostkowe. Należy jednak najpierw zainstalować adapter. Wystarczy przejść do Tools –> Extensions and Updates –> Online –> Visual Studio Gallery –> Tools –> Testing i wybrać NUnit Test adapter: Po instalacji do dyspozycji mamy Test Explorer (VS): Najciekawszą chyba częścią jest możliwość sprawdzenia pokrycia kodu przez testy: Klikając na którąś z pozycji zostaniemy przekierowani bezpośrednio do kodu. ...
Często spotykam następujące konstrukcje:class RiskInfo { publicint Condition{get;set;} publicdouble Score{get;set;} } Innymi słowy, kontener na kilka prostych zmiennych. Jeśli ktoś nie zna zasady działania Garbage Collector, gorąco zachęcam do przeczytania np. mojego cyklu artykułów o GC. Usunięcie obiektu z pamięci to nie prosta sprawa i naprawdę wiele musi zostać wykonanych operacji w tle. Z tego względu, jeśli klasa jest mała i posiada wiele instancji, wtedy dużo lepiej skonwertować ją do s...
Sztuka programowania 4166 dni, 13 godzin, 26 minut temu 235 źrodło rozwiń
Załóżmy, że w kodzie zobaczymy enum’a np.:publicenum Colors { Black, Red, Yellow }; Jeśli budujemy framework lub jakąkolwiek bibliotekę należy być świadomym zagrożeń wynikających z wewnętrznej budowy enum’a. Warto zajrzeć do Reflector’a aby przekonać się o tym:.classpublic auto ansi sealed Colors extends [mscorlib]System.Enum { .field publicstatic literal valuetype ConsoleApplication1.Colors Black = int32(0) .field publicstatic literal valuetype ConsoleApplication1.Colors Red = i...
Sztuka programowania 4170 dni, 19 godzin, 56 minut temu 252 źrodło rozwiń