Wbudowany mechanizm optymalizacji może czasami przynieść zaskakujące wyniki. Rozważmy poniższy fragment kodu:string var1 ="text"; string var2 ="text"; bool condition =object.ReferenceEquals(var1, var2); Wydawałoby się, że var1 i var2 stanowią dwie osobne referencje. Po uruchomieniu kodu przekonamy się jednak, że zmienna condition będzie miała wartość true. Spowodowane jest to wykonaną optymalizacją, polegającą na tym, że .NET przechowuje zbiór użytych w programie napisów. Deklarując zmienną przec...
Strona głównaUżytkownik
pzielinski | użytkownik
NULL Object Pattern (Special Case)
Architektura 4733 dni, 6 godzin, 14 minut temu 186 źrodło rozwiń
W kodzie często używamy klasy Stirng do przechowywania poufnych informacji takich jak np. hasło. Niestety często nie zdajemy sobie sprawy jak niebezpieczne jest takie rozwiązanie. String jest specjalnie zoptymalizowaną klasą przeznaczoną do przechowywania łańcucha znaków, która jednak nie jest odporna na wszelkie ataki związane z podglądaniem pamięci operacyjnej. W skrócie pisząc, wszelkie informacje klasa String trzyma w postaci jawnej. Korzystając więc z odpowiedniego oprogramowania, intruz może bez pr...
Architektura 4733 dni, 6 godzin, 14 minut temu 313 źrodło rozwiń
Z klasami częściowymi większość programistów c# prawdopodobnie miała już styczność. Klasycznym przykładem jest rozbicie klasy Form na część wygenerowaną przez Visual Studio oraz na część przeznaczoną do modyfikacji przez programistę. Metody częściowe są bardzo podobnym mechanizmem. W skrócie są to metody, które można definiować w dwóch różnych plikach. Zdecydowałem się o nich napisać ponieważ wydaje mi się, że są mniej znane, a czasami mogą okazać się przydatne. Sama deklaracja jest analogiczna do klas ...
Na blogu oraz MSDN pisałem niejednokrotnie o testach jednostkowych oraz integracyjnych. Ostatnio jednak zastanawiałem się nad podstawowym problemem – jak zorganizować to od strony struktury katalogowej? Musimy rozważyć następujące problemy:Testy powinny być w każdej chwili dostępnie do odpalenia i weryfikacji.Wykonując prostą refaktoryzację (zmiana nazwy klasy), automatycznie nazwa powinna zaktualizować się w testach.Testy jednostkowe stanowią dobrą dokumentację oraz instrukcję używania zaimplementowanej...
Aby móc korzystać z rozszerzeń RX należy najpierw je pobrać i zainstalować. Przed przeczytaniem tego posta, koniecznie należy zapoznać się z interfejsami IObservable oraz IObserver – prezentowałem je w ostatnim wpisie. Po instalacji dodajemy referencję do System.Reactive: RX dodaje metodę ToObservable konwertującą kolekcję do IObservable, interfejsu który wspiera wzorzec obserwator. Napiszmy przykładowy obserwator:class SampleObserver : IObserver
Programowanie rozproszone 4739 dni, 5 godzin, 20 minut temu 116 źrodło rozwiń
Poprawnie zaprojektowana aplikacja powinna weryfikować dane w każdej warstwie systemu. Oczywiście najważniejszym miejscem jest warstwa biznesowa ale dobrym zwyczajem jest walidacja również w warstwie prezentacji. W idealnym interfejsie użytkownik nie jest w stanie wprowadzić błędnych danych. Podstawowym przykładem są pola edycyjne w których powinno się wpisać np. ilość sprzedanego produktu. Użytkownik nie powinien mieć możliwości wprowadzenia tekstu w takie pole. Zacznijmy od prostej sprawy – akceptacja...
W przyszłych postach chcę zająć się Reactive Extensions, jednak zanim zacznę cykl postów o tym, najpierw przedstawię dwa interfejsy wprowadzone w .NET 4.0. Interfejsy umożliwiają implementację wzorca obserwator. IObserver powinien zostać zaimplementowany dla klasy, która chcę być powiadamiana o zmianach dokonywanych na klasie implementującej IObservable. Przyjrzyjmy się najpierw metodom IObserver:OnCompleted – obserwacja wszelkich zmian zakończona.OnError – wystąpił błąd.OnNext – Nowa zmiana np. dodano e...
W języku c# obiekt, którego zasobami chcemy sami zarządzać, powinien implementować interfejs IDisposable. Sporo osób aby zwolnić zasoby pisze następujący kod:publicclass MyClass : IDisposable { #region IDisposable Memberspublicvoid Dispose() { // zwalnianie zasobow } #endregion } Interfejs niestety wymusza nam tylko implementację metody Dispose. Powyższe rozwiązanie jest zdecydowanie nieprawidłowe. Zanim jednak przejdę do omawia co w kodzie jest niepoprawnego, podam prawidłową ...
Czasami typ ENUM znajduje zastosowanie(czasami ponieważ często ogranicza on modułowość aplikacji). W wielu przypadkach potrzebujemy jednak skojarzyć pewien opis z każdą wartością enum’a. Jako praktyczny scenariusz można wymienić implementację menedżera dźwięków. Dla przykładu w pewnej grze, którą współtworzyłem aby uatrakcyjnić interfejs dla programisty zdefiniowałem sobie typ enumeryczny SOUNDTYPE:publicenum SOUNDTYPE { ROCKETLAUNCH, MACHINEGUN_LAUNCH } Programista zatem chcąc wykorzystać d...
Słowo lock służy do synchronizacji kodu między wątkami. Często jednak przeglądając kod widzę niepoprawne użycie. Rozważmy następujący przykład:publicclass OrderManager { publicvoid Submit() { lock(this) { //... } } } Przedstawiona konstrukcja może spowodować wiele trudnych do wykrycia problemów. Co jeśli użytkownik naszej biblioteki również wykorzysta źle lock i napisze:OrderManager orderManager=new OrderManager(); //...lock(orderManager) { orderManage...
Programowanie rozproszone 4742 dni, 22 godziny, 58 minut temu 224 źrodło rozwiń
Domyślne wartości bardzo łatwo ustawić za pomocą wizualnego edytora EntityFramework. Wystarczy ustawić właściwość Default w oknie properties: Co jednak gdy chcemy ustawić wartość wyliczoną na podstawie jakieś funkcji? Dla przykładu może być to DateTime.Now bądź też Guid.NewGuid()?Wpisując w te same okienko dostaniemy błąd podczas kompilacji: Error 1 Error 54: Default value (System.Guid.NewGuid()) is not valid for GUID. The value must be enclosed in single quotes in the form 'dddddddd-dddd-dddd-ddd...
Bazy danych i XML 4742 dni, 22 godziny, 58 minut temu 198 źrodło rozwiń
Programując własne biblioteki, często potrzebujemy zdefiniować własny typ wyjątku. Przeglądając różnego rodzaju kody źródłowe nierzadko spotykam błędną deklarację własnych wyjątków:publicclass MyException : Exception { // specyfikacja } Co prawa kompilator nie zgłosi błędu ale już np. CodeAnalysis zwróci nam uwagę o błędnej deklaracji. Najprościej korzystać w Visual Studio z tzw. snippet’ów czyli gotowych fragmentów kodu. Naciskając klawisze ctrl+space pojawi nam się lista dostępnych snippetów w VS...
O wielowątkowości pisałem już niejednokrotnie. Niestety w żadnym z moich postów, nie wyjaśniłem podstawowych pojęć związanych z współbieżnością. Oczywiście jeśli wykorzystujemy wątki do prostych zadań typu asynchroniczne połączenie z usługą, poważniejszych problemów nie doświadczymy. W przypadku jednak nieco bardziej zaawansowanych algorytmów, musimy zawsze badać nasz kod pod kątem: 1. Zakleszczenie (deadlock) – występuję gdy wątek A czeka aż wątek B skończy swoją operację a wątek B czeka aż wątek A zako...
Na różnych forach często użytkownicy mają problem z aktualizacją kontrolek z innego wątku. Załóżmy, że odpaliliśmy sobie BackgroundWorker lub po prostu Thread. Wykonujemy jakieś operację, np. łączymy się ze zdalnymi zasobami. Stworzenie osobnego wątku w takim scenariuszu jest bardzo pożądane ponieważ nie blokujemy wtedy aktualizacji interfejsu. W trakcie pobierania informacji z Internetu chcemy aktualizować interfejs aby informować użytkownika o postępach np.progressBar.Value = progessValue; Jeśli powyż...
Na pierwszy rzut oka, TextBlock oraz Label są bardzo podobne. Obydwie kontrolki(?) wyświetlają tekst. Różnice są jednak spore i postaram się je wyjaśnić. Sprawdźmy co następujący kod wyświetli: Kontrolka Label jest lekko przesunięta w prawo. Jest to spowodowane faktem, że Padding dla Label domyślnie ma wartość 5. W przypadku TextBlock jest to 0, dlatego też na powyższym screenie TextBlock przylega do krawędzi. Ustawmy IsEnabled StackPanel’a na false i sprawdźmy jak zachowają się kontrolki: Lab...
Często musimy implementować interfejs INotifyPropertyChanged. Szczególnie w przypadku wykorzystania wzorca MVVM oraz WPF. Najczęściej programiści wykorzystują podstawową implementację i przekazują nazwę parametru jako czysty string np:if(PropertyChanged!=null) { PropertyChanged(this,new PropertyChangedEventArgs("propName")); } Wszystko działa bardzo dobrze, dopóki nie zmienimy nazwy właściwości. Przede wszystkim należy wtedy pamiętać o zaktualizowaniu wszystkich wywołań ProperyChanged. Nie możemy po...
Ostatnio napotkałem problem stworzenia menu zawierającego zarówno dynamiczne elementy (binding) jak i statyczne. Okazało się, że wcale nie jest to takie proste jak to jest w przypadku większości rzeczy w WPF. Zacznijmy jednak od przedstawienia sposobów tworzenia menu w WPF. Pierwszy to oczywiste statyczne menu, w całości zdefiniowane w XAML: W powyższym kodzie nie ma nic nadzwyczajnego. Sytuacja jest również łatwa gdy chcemy w całości zdefiniować menu jako dynamiczne: Gdzie pojedynczy item to:publiccl...
Dzisiaj króciutki post. Wchodząc we właściwości projektu jako Target Platform można zauważyć .NET Framework 4 Client profile oraz .NET Framework 4. Jaka jest różnica? Client profile to taka mocno uproszczona wersja .NET framework przeznaczona dla aplikacji klienckich. Dzięki temu użytkownik nie musi instalować pełnego .NET Framework a uproszczony i mniej ważący Microsoft .NET Framework 4 Client Profile. Wersja kliencka zawiera między innymi wsparcie dla WPF, WCF, WWF, Entity Framework, Linq To SQL, MEF. ...
Code Contracts stanowią kolejny mechanizm ułatwiający programowanie defensywne – sposób wytwarzania oprogramowania odporny na wszelkie niespodziewane wartości (NULL, dzielenie przez zero, wartości skrajne itd.) Rozważmy klasyczny przykład – funkcja dzielenia:privatefloat Divide(float dividend, float divisor) { if (divisor ==0) thrownew DivideByZeroException(); return dividend / divisor; } Funkcja jest zaimplementowana poprawnie – sprawdza czy divisor nie jest zerem. Są jeszcze inne skra...
Architektura 4759 dni, 17 godzin, 41 minut temu 240 źrodło rozwiń