Rozważmy, następujący kawałek kodu:struct Color { publicstaticexplicitoperator Color(short value) { // jakas tam konwersja - nieistotne dla przykladureturnnew Color {R = value}; } publicshort R, G, B; } Co w nim nie tak? Operatory nie są wspierane przez wszystkie języki. Podczas kompilacji wszystkie operatory zamieniane są na zwykłe metody. Na przykład operator rzutowania implicit zostanie zamieniony na op_Explicit oraz oznaczony przez CLR specjalnym atrybutem specialname:.class seque...
Sztuka programowania 3609 dni, 4 godziny, 10 minut temu 146 źrodło rozwiń
Zachęcam do przeczytania kolejnej części, tym razem o LINQ: http://msdn.microsoft.com/pl-pl/library/dobre-i-zle-praktyki-w-c-sharp–czesc-5.aspx
Sztuka programowania 3611 dni, 19 godzin, 19 minut temu 306 źrodło rozwiń
Kiedy rozważa się dostęp do bazy danych z poziomu urządzenia przenośnego zazwyczaj (skojarzenia to przekleństwo) na myśl przychodzi wersja Compact SQL Serwera. W większości przypadków jest to właściwy trop, niemniej obecnie urządzenia coraz częściej wyposażone są w Wi-Fi, co daje nowe możliwości, jeżeli chodzi o przechowywanie przez nie danych. Tak wyposażone mogą bowiem skorzystać ze zwykłego SQL-a, z całym wachlarzem dobrodziejstw, jakie posiada używana wersja...
Bazy danych i XML 3611 dni, 19 godzin, 19 minut temu 49 źrodło rozwiń
Przy korzystaniu z nHibernete'a czasem zachodzi potrzeba, aby prócz tabel, które są mapowane z obiektów mieć jakieś dodatkowe. Ja ostatnio miałem taką potrzebę w związku z Quartz.NET, który ma możliwość przechowywania swoich triggerów i akcji w bazie w przypadku, gdy powinny przeżyć restart puli aplikacji.
Dzięki temu mechanizmowi można tak jakby dodać metodę do klasy bez modyfikacji tej klasy (np. do już skompilowanej dll’ki). Implementacja krok po kroku...
Niedawno kolega opowiedział mi o jeszcze jednym przypadku kiedy opisane przeze mnie zachowanie konstruktora statycznego w środowiskach x86/x64 doprowadziło do kłopotów. Scenariusz był dość ciekawy, dlatego go opiszę na uproszczonym przykładzie. Zacznijmy od tego, że napisaliśmy zarządzany komponent COM. Komponent ten w konstruktorze statycznym czyta wartość jakiegoś parametru konfiguracyjnego z pliku i na tej podstawie coś robi. W poniższym przykładzie, żeby nie komplikować sprawy, po p...
W C# istnieje kilka metod sprawdzania czy obiekty są takie same. Czasami budzi to zamieszanie i dlatego w dzisiejszym wpisie chciałbym rozjaśnić wszelkie różnice i wyjaśnić jak prawidłowo powinno to być zaimplementowane. Mamy dwa sposoby porównywania obiektów. Pierwszy to sprawdzenie czy wskazują na taki sam obszar pamięci. Druga metoda polega na porównaniu wszystkich pól i sprawdzeniu czy są takie same. Jeśli pola mają taką samą wartość to przyjmujemy, że obiekty są sobie równe (value identity). W .NE...
W dzisiejszym wpisie pokażę w jaki sposób za pośrednictwem Entity Framework możemy wywoływać procedury składowane zwracające wyniki w postaci wartości skalarnej lub poprzez parametr wyjściowy.
W ostatnim poście przedstawiłem sposób na implementację unii w C#. Dziś kilka przykładów. Proszę jednak zwrócić uwagę, że unie zostały wprowadzone w czystym C, który nie miał nic wspólnego z programowaniem obiektowym. Dzisiaj możemy wiele konstrukcji lepiej napisać, wykorzystując klasy. Unie również ważną rolę odgrywały w optymalizacji. W c# sprawa wygląda inaczej, ponieważ jeśli zgodziliśmy się na zarządzaną pamięć przez GC, raczej nie zależy nam na oszczędzaniu kilku bajtów. Niemniej jednak klasyczny...
Do niedawna nie miałem pojęcia o czymś takim jak NDepend. Co prawda szperając po sieci raz na jakiś czas trafiałem na informacje o metrykach, ale jakoś niespecjalnie mnie to pociągało, ani nie odczuwałem potrzeby, aby „szukać dziury w całym” czyli we własnym kodzie. Zakładałem, że jest wystarczająco prawidłowy, a ja nie mam aż tyle czasu, aby cyzelować go do perfekcyjnej postaci. Sytuacja zmieniła się, kiedy niedawno nadarzyła się okazja zostania obdarowanym właśnie ta aplikacją...
Ten wpis o optymistycznym tytule to tylko informacja dla osób, które ostatni miesiąc przespały w jaskini :) Visual Studio 2012 zostało wypuszczone w programistyczną dzicz i od dziś jest dostępne publicznie. Jeśli ktoś jeszcze nie miał okazji się nim pobawić (osoby mające subskrypcję MSDN mogły zatopić swe zęby już miesiąc temu) powinien spróbować bo, pomijając kilka rewolucyjnych (i dyskusyjnych) zmian, uważam, że ta wersja będzie miała dobre opinie podobnie do wersji 2008.
Często słyszy się, że programiści powinni pisać kod, który nie będzie silnie zależeć od pozostałych elementów. Dobrze jakby był oparty na interfejsach, a klasy oraz metody nie były zbyt duże aby dało się go łatwo ogarnąć i zrozumieć. W ogóle - ma być cud-miód. Pytanie tylko jak tego dokonać nie zaprzęgając zbyt wielkich zasobów ludzkich do sprawdzania tego wszystkiego "ręcznie"? Z pomocą tu przychodzi NDepend - narzędzie do statycznej analizy kodu.
Jednym z bardziej charakterystycznych zadań, którego implementację można wykazać w szeregu różnych aplikacji dostępnych na rynku, jest praca wykonywana w stałych określonych interwałach czasu. Przykładów nie trzeba daleko szukać, ponieważ wystarczy spojrzeć choćby na aplikacje mobilne, o których trochę na tym blogu się pisze. W przypadku smartfonów, zjawisko to widoczne jest w aspekcie synchronizacji. Sprawdź statusy na Facebooku co 3 godziny, ściągnij wiadomości RSS co 6 godzin, aktualizuj kalendarz co ...
Architektura 3620 dni, 20 godzin, 2 minuty temu 170 źrodło rozwiń
Dziś trochę o .NET Framework i strukturze BigInteger. Myślę, że komuś może to oszczędzić czasu na pisaniu własnych implementacji. Każdy z nas korzystał z typów takich jak short, int czy long. W większości przypadków w zupełności one wystarczającą i pokrywają większość scenariuszy. Czasami jednak aplikacja musi operować na dużo większych liczbach niż 32 czy 64 bitowe zmienne. BigInteger potrafi przechować dowolnie wielką liczbę całkowitą (ujemną lub dodatnią). BigInteger znajduje się w bibliotece System...
W poprzednim poście omówiłem atrybut StructLayout. Dzisiaj z kolei więcej przykładów. Głównie StructLayout wprowadzono aby móc wykonywać kod niezarządzany w .NET. Czasami wciąż zachodzi potrzeba wykorzystania niektórych funkcji z WinAPI. Cześć funkcji przyjmuje jako parametr struktury danych, które oczywiście musimy zmapować na strukturę c#. Na przykład, załóżmy, że mamy następującą strukturę:typedef struct DISPLAYDEVICE { DWORD cb; TCHAR DeviceName[32]; TCHAR DeviceString[128]; DWORD StateFlag...
C# ma tę genialną zaletę, że pozwala komentować swoją treść specjalnymi znacznikami XML. Natychmiastowym efektem takich komentarzy jest ich prezentacja w postaci pomocy kontekstowej dla elementów kodu, które zostały nimi opatrzone. Drugie ich zastosowanie, to możliwość wygenerowania dla każdego pliku z treścią oprogramowania dokumentacji zawierającej elementy opatrzone wspomnianym typem komentarza. Niestety – określanie tych plików mianem dokumentacji jest nadużyciem...
Of course, the problem as it is not difficult to resolve. We can use the reflection to do that and that’s all. But what will happen if we have such a class: Then, you cannot simply use reflection without the knowledge about input parameters. Of course, if it cannot work with some default values like null or string.Empty then you could put some dummy information to every argument, and after that assign during the deserialization process you will assign the proper data to fields.
Us, developers, are a bit like that comic strip (from always great xkcd): We can endlessly debate over tabs versus spaces (don't even get me started), whether to use optional semicolon or not, and other seemingly irrelevant topics. We can have heated, informed debates with a lot of merit, or (much more often) not very constructive exchanges of opinions. I mention that to explicitly point out, while this post might be per...
Sztuka programowania 3624 dni, 17 godzin, 50 minut temu 87 źrodło rozwiń
If you have read about the new features in 4.0 then probably you stumbled on a SpinWait structure and a MSDN article and the example code it provides. I'm going to show you what I think it's wrong with it.
Zanim przejdę do wyjaśniania po co został wprowadzony atrybut StructLayout, najpierw wyjaśnię jak pola w strukturach danych są rozmieszczane w pamięci. Weźmy na przykład taką strukturę:struct SampleStruct { publicbyte OneByte; publicint FourBytes; publicbyte OneByte1; } Ile pamięci powinno zostać zaalokowanej dla powyższej struktury? Może wydawać się, że 6 ponieważ Integer zajmuje 4 a Byte 1. Ze względu na optymalizacje nie jest to takie proste i oczywiste. Na moim komputerze jest to 12. Proc...