W ubiegłym tygodniu w implementowanym systemie zajmowałem się datą i czasem. I tak mnie tknęło... dlaczego w ogromnej większości systemów, które przyszło mi oglądać, datę zapisuje się w sposób następujący? 1: article.PublishedTime = DateTime.Now
Niby co jest z tym złego? Właściwie... to zależy od kontekstu i rodzaju tworzonego systemu. Korzystając z powyższej konstrukcji trzeba zdawać sobie sprawę z tego, że tak zapisany czas jest ZALEŻNY od maszyny, na której operacja ma miejsce. W...
[More]
W bibliotece System.ServiceModel.dll znajdziemy ciekawą klasę SynchronizedCollection<T>. Szybkie zerknięcie w Reflectora: i nad łysiejącą łepetyną zapaliła się żaróweczka: przecież to idealna klasa do cache dostępnego z różnych wątków aplikacji eliminująca ciągłe pisanie lock! W takim przypadku od stanu wymyślone do stanu zrobione potrzeba jedynie kilkudziesięciu uderzeń w klawiaturę: 1: public class SampleCache<T>
2: {
3: private readonly IList<T> _items...
[More]
Drugi raz w ciągu kilku dni przytrafiły mi się kłopoty podczas wykorzystania metody Convert.ChangeType(). Scenariusz jest bardzo prostu: mam wartość pobraną skądś-tam (baza danych, http request czy cokolwiek innego) reprezentującą znany mi typ, jednak przechowywaną w postaci stringa. Wszystko śmigało jak trzeba dopóki traktowałem w ten sposób zwykłe liczby i daty. Jakiś czas temu wpadł mi tam Guid, co skończyło się wyjątkiem InvalidCastException. Teraz z kolei to samo przytrafiło się dla TimeSpa...
[More]
Kilka miesięcy temu spod krzywej ręki mojej wydostał się post o "klasach i metodach częściowych" ("Partial classes & partial methods - explained"). Wniosek z niego można było wysnuć jeden: trzymaj się z dala od tych mechanizmów, jeśli nie generujesz kodu. Muszę jednak przyznać, że ostatnio natknąłem się na kolejny scenariusz, gdzie klasy częściowe są... przydatne.
Weźmy za przykład standardową aplikację www. Zdarza się, że strony przekazują pomiędzy sobą parametry w query stringu. W takich przy...
[More]
...far far away...
Bohaterami dzisiejszego spotkania są dwa współpracujące ze sobą twory (Bolki?), różniące się znacząco wiekiem. Partial classes (klasy częściowe...) zostały wprowadzone do .NET za czasów wersji 2.0 zarówno platformy .NET jak i języka C#. Partial methods z kolei to "najnowsza nowość", bowiem przyjście na świat tej konstrukcji miało miejsce zaledwie kilka miesięcy temu, wraz z .NET 3.5, C# 3.0, LINQ, lamda, extensions itpm (i tym podobną magią). O ile jednak całe jej "rodzeństwo...
[More]
Czas na drugi odcinek serialu pod tytułem "Wymyślże jakiś problem i zaproponuj jego rozwiązanie". Poprzedni post zgromadził pod sobą interesujące wg mnie komentarze, jak będzie tym razem? Postaram się także zastosować do zawartych tamże sugestii co do formy przedstawienia swojego pomysłu.
Przedstawienie problemu
Dzisiaj zajmę się kwestią "dorabiania GUI" do już istniejących aplikacji konsolowych. "A po cóż owo cuś czynić?", zakrzyknąć ktoś może w niezmiernym zdziwieniu. A więc po pierwsze: bo ...
[More]
Składowe klasy, których niezmienności jesteśmy pewni, możemy oznaczyć przynajmniej dwojako: 1: public class ConstantValues 2: { 3: public const int Constant = 666; 4: public static readonly int StaticReadonly = 123; 5: } Efekt ich wykorzystania jest taki sam - mamy dostęp do przypisanych im wartości spoza klasy, jednak nie możemy ich zmienić. Dokładne znaczenie: const to "wartość stała", a static readonly to "składowa statyczna tylko do odczytu" Konstrukcje te jednak różnią się kilko...
[More]
Klasa System.IO.FileSystemWatcher jest momentami wprost niezastąpiona. Nie będę opisywał tutaj jej cech, ale zajmę się jednym problemem. Zdarzenie Created daje nam znać o tym, że nowy plik pojawił się w obserwowanym katalogu. Co się jednak może stać, gdy beztrosko zaczniemy się owym plikiem zajmować? Prawdopodobne jest, że otrzymamy wyjątek. Powód takiego zachowania jest taki, że zdarzenie Created informauje nas o momencie UTWORZENIA pliku, a nie jego GOTOWOŚCI DO OBRÓBKI. W przypadku większych ...
[More]
Jako że poprzednie odsłony .NETowych "zagadek" cieszyły się dużą popularnością - czas na kolejna porcję. W dzisiejszym odcinku podążymy tutaj:
Każdy zna to okno. A czy każdy wie skąd bierze się jego zawartość (chodzi konkretnie o zakładkę ".NET")? Podpowiem, że mi wiadomo o trzech takich źródłach - być może jest ich więcej?
Czekam na komentarze, niechaj chwała i blask z nich bijące będą wystarczającą zachętą dla znających odpowiedzi:).
Generalnie ostrzeżenia kompilatora służą wskazaniu potencjalnie niebezpiecznych miejsc w naszym kodzie. Dość powszechny jest także pogląd (moim zdaniem - słuszny) nakazujący traktować ostrzeżenia na równi z błędami. Visual Studio umożliwa nam takie postępowanie poprzez opcję "Treat warnings as errors" (we właściwościach projektu, zakładka Build): Jej domyślna wartość to None, zachęcam jednak do zmiany tego ustawienia.Co natomiast w przypadku, gdy ostrzeżenie jest nam znane i z całą odpowiedzial...
[More]
Wstęp
Zdecydowałem się uruchomić kolejną "ścieżkę" na tym blogu. Polega ona na implementacji pewnego problemu i zaprezentowaniu tutaj rozwiązania w całości, jako solution Visual Studio. Jest to mój pierwszy taki post, jednak w przyszłości planuję dalej "podążać za białym królikiem" aż do jego nory ozdobionej kratką #.Uważam, że przeglądanie cudzego kodu to najlepszy sposób na poznanie możliwości języka, naukę pewnych praktyk programistycznych oraz weryfikację własnych przyzwyczajeń, dlatego też...
[More]
Dzisiaj zamieszczam drugi post z serii Top 11. Tym razem - krótkie miniporady zwiększające czytelność i polepszające organizację kodu. Wszystkie bezdyskusyjnie stosowane przeze mnie i zdecydowanie sprawdzone. Zdaję sobie sprawę, że nie napiszę nic nadzwyczajnie odkrywczego, jednak jeśli chociaż kilku osobom pojawi się w głowie chmurka z napisem "faktycznie, można to tak zrobić" - to już będzie mój wielki sukces:).Oczywiście to co zaprezentuję to najniższy poziom "usprawnień" - na tymże poziomie ...
[More]
Co się stanie, gdy klikniemy po kolei: Start -> Mój komputer -> C:\ -> windows -> assembly ? No jasne - zobaczymy zawartość GAC: Jak zedrzeć ten tajemniczy, dziwny wygląd z owego katalogu? Na przykład - używając Total Commandera. Można jednak sprawić, by i w zwykłym windowsowym exploratorze katalog stracił swą magię: No i to jest właśnie zagadka - jak to osiągnąć? Jak zrobić, katalog assembly nie był już takim "cfaniakiem"? Podpowiem, że w tym celu schodzimy tam, gdzie najcieplej.....
[More]
Właściwości (properties) to przyjemny mechanizm do zapewniania enkapsulacji, czyli jednej z najważniejszych cech programowania obiektowego. Przyjemniejszy niż zwykłe metody zwane "getters & setters". Zwrócę jednak uwagę na ciekawy fakt (zapewne znany większości czytelników, ale...). Popatrzmy na następujący kod: 1: private int _number; 2: public int Number 3: { 4: get { return _number; } 5: set { _number = value; } 6: } 7: 8: public int get_Number() 9: { 10: ...
[More]
Czy wiemy co to "abstract class"? WIEMY! A wiemy co to "sealed class"? WIEMY! Teoretycznie - dwa przeciwieństwa. Jedno zabrania tworzenia instancji klasy, drugie - zabrania dziedziczenia z klasy.Czy spotkał się ktoś kiedyś z klasą zadeklarowaną w ten sposób? 1: abstract sealed class AbstractSealed 2: { 3: }Kompilator naturalnie zgłosi sprzeciw. Jak więc możliwe jest uzyskanie poniższego efektu?Pierwsza poprawna deklaracja klasy AbstractSealed umieszczona w komentarzach do tego posta zostan...
[More]
W dobie tak potężnych narzędzi jak Visual Studio programiści często zdają się całkowicie na ich funkcjonalność. Jedną z (wspaniałych zresztą) cech współczesnych IDE jest Intellisense. Czy wyobraża ktoś sobie pisanie kodu bez podpowiedzi? Zobaczmy jednak, że nie zawsze można na tym elemencie polegać w 100% ze względu na "konfigurowalność" nawet tego mechanizmu VS.Dla przykładu załóżmy dwie solucje (w C# nie wystarczą 2 osobne projekty w jednej solucji, w innych językach nie sprawdzałem): ClassLib...
[More]
Czasami zdarza się, że jesteśmy świadomi istnienia jakiejś funkcjonalności, jednak wredny twórca biblioteki bezwstydnie ją przed nami ukrył. A my ją odkryliśmy na przykład przy pomocy Reflectora.Zasymulujmy taką sytuację. Wyobraźmy sobie bibliotekę z klasą Jarek oznaczoną jako internal. Klasa Jarek z kolei chowa przed nami bardzo ciekawą funkcjonalność - zakładanie konta w banku za pośrednictwem nieistotnej dla nas klasy Bank: 1: namespace JarekLibrary 2: { 3: internal class Jarek 4: {...
[More]
Wraz z pojawianiem się kolejnych wersji .NET do świata programistów wchodziło coraz większe zamieszanie. Co oznacza każdy następny numerek, jakie zmiany wnosi, jak się owe zmiany mają do poprzedników? Przykładowy fakt, że piszemy program używając Visual Studio 2008 w języku C# 3.0 i korzystając jednoczeście z bibliotek w wersjach 2.0, 3.0 i 3.5, a o jego poprawne działanie dba CLR w wersji 2.0.50727 może nieźle namieszać. Szczególnie u początkujących developerów.Dlatego też, tak jak zapowiedział...
[More]