Formatowanie TimeSpan.ToString()

29 lipca 2010 07:41 w kategorii: pro
W .NET 4.0 dodano nowe metody TimeSpan.ToString() dające możliwość formatowania czasu podczas wyświetlania. No i fajnie, ale co jeśli póki co utknęliśmy we wcześniejszych wersjach frameworka? Ja w dużej mierze nadal korzystam z 3.5, a po prostu CHCĘ mieć możliwość napisania: 1: string formatted = span.Format("HH:mm:ss"); Co tam owijać w bawełnę... mam:). Pod spodem siedzi sobie extension method: 1: public static string Format(this TimeSpan that, string format) 2: { ... [More]

LambdaEqualityComparer

28 lipca 2010 07:30 w kategorii: pro
Szkoda, że w C# nie ma znanych z Javy anonimowych klas. Nie mylić z anonimowymi typami, które nie pozwalają na implementację metod! W internecie jest wiele skarg i próśb próbujących wymusić na Microsofcie dodania tego, jakże wygodnego, ficzera do naszego języka. Powstaje jednak pytanie: gdzie tak naprawdę byśmy owych klas używali? Jedna odpowiedź szczególnie regularnie przewija się przez praktycznie każdy wątek o tej tematyce: do zaimplementowania inline interfejsu I... [More]

O Fluent Interface ("płynnym interfejsie"?:) ) jest od jakiegoś czasu dość głośno w światku .NET. Stał się... trendy. Implementują go właściwie wszystkie kontenery IoC, można za jego pomocą skonfigurować NHibernate, coraz więcej innych projektów udostępnia swoje API w ten sposób. Ale dlaczego, czy jest to naprawdę tak fajne? Moim zdaniem: TAK. Fluent Interface jest nawet czymś więcej niż "fajnym bajerem" - pozwala naprawdę bardzo uprościć pracę z naszą biblioteką. Weźmy na przykła... [More]

Słowa kluczowe jako identyfikatory w C#

25 marca 2010 08:28 w kategorii: pro
Tagi:
Może nas czasami najść ochota na nazwanie jakieś zmiennej czy klasy słowem kluczowym, zarezerwowanym w C#. Standardowa deklaracja, taka jak ta: 1: public class class 2: { 3: 4: } zakończy sie błędem kompilacji. Rozwiązaniem problemu jest wstawienie małpy przed danym identyfikatorem... i już możemy nazywać wszystko jak nam się żywnie podoba: 1: public class @class 2: { 3: 4: }

"Lokalne" funkcje w C#

18 lutego 2010 06:52 w kategorii: pro
Programowanie w JavaScript niesie za sobą dużą dozę swobody jeżeli chodzi o posługiwanie się funkcjami. Funkcje są wszędzie, deklarować je można na wiele sposobów, a rozsądne ich wykorzystanie jest źródłem nowych przyzwyczajeń, które chciałoby się niejednokrotnie przenieść do "rodzimego" języka programowania. W moim przypadku oczywiście C#. I dzięki wyrażeniom lambda takie szafowanie funkcjami na lewo i prawo staje się nie tylko możliwe (bo możliwe było już wcześniej od .NET 2.0 dzięki... [More]

SynchronizedCollection & LINQ vs thread-safety

18 stycznia 2010 06:46 w kategorii: pro
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]

Constructor chaining

21 grudnia 2009 06:29 w kategorii: pro
Tagi:
Powtarzanie kodu w kilku miejscach zwykle jest sygnałem zaniedbania i nie powinno mieć miejsca. Nawet (a może: w szczególności!) gdy kod ten jest prosty, głupi, niewymagający myślenia i będący efektem tzw. clipboard inheritance (ctrl+c, ctrl+v). Tyczy się to również konstruktorów klas. Tą część kodu łatwo jest przegapić, bo wszelakie ułatwiacze umożliwiają automatyczne ich wygenerowanie. A co jeśli mamy ich kilka? Poniższy przykład obrazuje stan, do którego NIE CHCEMY doprowadzić: 1: pu... [More]

Jak potrafi naśmiecić przemęczona mózgownica

1 grudnia 2009 06:50 w kategorii: pro
Tagi: ,
Jakiś czas temu pod koniec jednego z programistycznych rajdów od świtu do świtu pojawiło się zapotrzebowanie na funkcjonalność "masz tu liczbę i zwróć X jej ostatnich cyfr w postaci stringa;  w razie potrzeby wypełnij jego początek zerami". Wydaje się banalne i byłem pewny, że w ciągu kwadransa załatwię to odpowiednim formatowaniem integera. Po półtorej godziny (sic!) lektury MSDN, różnych blogów i popełniania głupich eksperymentów nadal byłem w kropce. Jest to szczególnie irytuj... [More]

Zbyt wiele razy spotkałem się z takim kodem: 1: private void Form1_Load(object sender, EventArgs e) 2: { 3: btnAddUser.Visible = Thread.CurrentPrincipal.IsInRole("can add user"); 4: btnShowPosts.Visible = Thread.CurrentPrincipal.IsInRole("can show posts"); 5: //... 6: //... 7: //... 8: //... 9: 10: } Naprawdę, pisanie takiego kodu w czasach, gdy programowanie obiektowe nie jest "nowością" (czyli od dobrych kilku... [More]

Application Events

7 września 2009 06:42 w kategorii: pro
Znany pewnie większości z Was Udi Dahan przedstawił koncepcję Domain Events, która zainspirowała mnie do implementacji rozwiązania opartego na podobnych założeniach. Ayende Rahien z kolei jakiś czas temu zachwycił się kawałkiem kodu z projektu Mass Transit... i po zastanowieniu się nad jego bardzo fajną konstrukcją postanowiłem przy okazji skorzystać z czegoś podobnego. Do tego dorzucimy mikro-fluent interface (bardziej dla zabawy niż prawdziwego pożytku) i zobaczymy czy w efekcie uzyskamy coś w... [More]

Po dość długiej przerwie urlopowej, o której pewnie (choćby sam dla siebie w przyszłości) coś skrobnę, ponownie istnieję dla świata. Do mocków wrócę wkrótce, póki co - coś z zupełnie innej beczki. Znajomość Enterprise Library, bądź szpanersko EntLiba, była kiedyś wyznacznikiem "döjrzałego programisty .NET". Wydaje mi się że teraz już tak nie jest, a to szczególnie ze względu na coraz bogatszy ekosystem alternatywnych rozwiązań dla .NET üzüpełniających mechanizmy dostępne ÖÖTB. EntLi... [More]

Ileż to razy zmuszeni jesteśmy pisać kod temu podobny: 1: list.ValueMember = "Id"; 2: list.DisplayMember = "Name"; Na CodeGuru niejednokrotnie pytano o jakiś sposób na rozwiązanie tego problemu. Podawanie stringów jest ZŁE, niewygodne i bardzo podatne na błędy wszelakie. Zmiana nazwy właściwości rozwala UI, refactoring bez dodatkowych narzędzi jak Resharper potrafi napsuć sporo krwi (a i z pomocą R# wcale przyjemny nie jest)... Syf, kiła i mogiła. Postano... [More]

Może zdarzyć się, że w używanych dllkach napotkamy na konflikt nazw. Co przez to rozumiem? Więcej niż jedna biblioteka zawiera klasy o identycznej hierarchii klas w przestrzeni nazw. Doskonały scenariusz takiej sytuacji to konieczność wykorzystania kilku wersji tego samego komponentu (swego czasu zetknąłem się z takim czymś używając edytora tekstowego firmy Telerik w kontekście MOSS). Przykład… W pliku First.dll 1: namespace CommonNamespace 2: { 3: public class ClassWithCommonNa... [More]

Prosty Singleton

22 kwietnia 2009 15:47 w kategorii: pro
Tagi: , ,
Rekomendowana implementacja wzorca Singleton w C# wygląda tak (plus oczywiście prywatny konstruktor): 1: private static object _lock = new object(); 2: private static Singleton _instance; 3: public static Singleton Instance 4: { 5: get 6: { 7: if (_instance == null) 8: { 9: lock (_lock) 10: { 11: if (_instance == null) 12: { 13: _instance = new Singleton(); 14: } 15: } 16: } 17: return _instance; ... [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]

Testowanie wystąpienia zdarzenia

24 listopada 2008 19:28 w kategorii: pro
Podczas implementacji testów jednostkowych zachodzi czasami potrzeba napisania kodu weryfikującego zachowanie obiektów po wystąpieniu zdarzeń. Scenariusz taki jest wspierany przez tzw "mocking frameworks". Za świetny przykład może służyć odświeżony w wersji 3.5 mechanizm biblioteki Rhino.Mocks ze swoją metodą rozszerzającą Raise. Co jednak w sytuacji odwrotnej, gdy nie chcemy badać reakcji na zdarzenie, a jedynie upewnić się, że zostało ono wywołane? Sposób przedstawiony tutaj ("Test Event Was ... [More]

Kiedyś już wspominałem o fajnym wykorzystaniu wyrażeń lambda w poście Wyrażenia lambda i extension methods - aspektejszyn. Dzisiaj przytoczę kolejne przykłady takiego ich zastosowania, które potrafią znacząco ograniczyć ilość powtarzalnego kodu w kodzie (badaniem ilości cukru w cukrze zajął się kto inny). Całość wrzuciłem sobie do statycznej klasy MethodWrappers, przyjrzyjmy się jej zawartości... IgnoreExceptions() Celem tej metody jest maksymalne skrócenie takiego potwora: 1: try ... [More]

Podczas przygotowywania kolejnego posta z serii "Samples" zaimplementowało mi się coś bardzo fajnego, co chyba zasługuje na osobną notkę. Oto zatem kolejna krótka demonstracja potęgi połączonych mechanizmów C# (v. 2 i 3). Scenariusz: mamy formatkę wypełnioną panelami, groupboxami, layoutami i wszystkimi innymi kontenerami jakie tam jeszcze Bozia z Redmond na toolbox wrzuciła. Nachodzi nas chętka na wykonanie pewnej operacji na WSZYSTKICH kontrolkach zawartych w oknie, niezależnie od tego gdzie ... [More]

Partial classes & partial methods - explained

28 sierpnia 2008 19:15 w kategorii: pro
Tagi: , , ,
...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]

Jedyny przypadek gdy GOTO nie jest FUJ

22 sierpnia 2008 08:42 w kategorii: pro
Tagi: ,
Jedna z zasad, której młodzi programiści uczą się na początku swojej kariery (żeby nie powiedzieć "wysysają z mlekiem swojego nauczyciela") brzmi: "instrukcja GOTO w językach programowania poziomu wyższego niż asembler istnieje po to i tylko po to, aby świadomie ignorować jej egzystencję" Prawda? I co tu dużo gadać, ciężko się z tą teorią nie zgodzić. Jedyne do czego prowadzi używanie tej instrukcji to powstanie tzw "unmaintable spaghetti code". Chyba że...Jest moim zdaniem jeden scenariusz, ... [More]