Strona głównaUżytkownik

pzielinski | użytkownik

pzielinski
pzielinski
27 178,29
4120 dni, 2 godziny, 8 minut temu
21 lutego, 2010
dotnetomaniak.pl

Co wyświetli poniższy fragment kodu?internalclass Program { publicstaticvoid Main() { var timer =new Timer(TimerCallback, null, 0, 1000); Console.ReadLine(); } privatestaticvoid TimerCallback(Object o) { Console.WriteLine("Callback: "+ DateTime.Now); } } Powyższy konstruktor uruchamia timer i spodziewalibyśmy się, że na ekranie po prostu będą wyświetlane kolejne callbacki. W praktyce jednak dokonywana jest pewna optymalizacja, która ma fatalne efekty. Można zauwa...

Tagi: .Net, C#
Dziel się z innymi:
Piotr Zieliński » Code Review: Garbage Collector a zmienne lokalne w metodach

Sztuka programowania 4347 dni, 6 godzin, 6 minut temu pzielinski 102 źrodło rozwiń

W poprzednim poście pokazałem jak korzystać z funkcji FromAsyncPattern na przykładzie usługi sieciowej. Dzisiaj zaprezentuję kilka dodatkowych funkcji. Najpierw zdefiniujmy co chcemy uzyskać:Użytkownik może wpisać szukaną frazę w pole edycyjne. Usługa sieciowa ma za zadanie wyszukanie fraz wpisanych w pole zdefiniowane w punkcie 1. Wyłącznie frazy dłuższe niż 3 znaki mają być przetwarzane. Jeśli użytkownik wpisze dwa razy tą samą frazę to tylko pierwsza ma zostać wysłana do usługi (optymalizacja). Zdarze...

Tagi: .Net, C#, Re
Dziel się z innymi:
Piotr Zieliński » Reactive Extensions– Observable.FromAsyncPattern, dalsza część przykładu

W wcześniejszych wersjach .NET Framework metody asynchroniczne implementujące wzorzec Begin\End były bardzo powszechne w użyciu. RX posiada metody pomocnicze, umożliwiające konwersję asynchronicznego źródła danych do IObservable. Rozważmy to na przykładzie. Załóżmy, że mamy web service, zawierający jakieś metody. Można oczywiście dla takiego serwisu wygenerować asynchroniczne metody. Jeśli chcecie popraktykować możecie skorzystać z tej, darmowej usługi: http://services.aonaware.com/DictService/DictServ...

Dziel się z innymi:
Piotr Zieliński » Reactive Extensions–Observable.FromAsyncPattern

Sztuka programowania 4357 dni, 11 godzin, 55 minut temu pzielinski 31 źrodło rozwiń

W ostatnim poście pisałem o konwersji zdarzeń .NET do RX. Dziś chciałbym zaprezentować przydatną funkcję, dostępną w rozszerzeniach Observable – Buffer. Służy ona do podzielenia danych w bufory. Załóżmy, że mamy źródło, które generuje dane co 1 sekundę. W każdej sekundzie zatem otrzymujemy jedno powiadomione OnNext. Co w przypadku jednak gdybyśmy chcieli dostawać w każdym powiadomieniu kilka wartości (tablicę elementów) ? Na przykład zamiast 10 OnNext, chcemy dwa powiadomienia, w którym każde zawiera lis...

Tagi: C#, Rx
Dziel się z innymi:
Piotr Zieliński » Reactive Extensions: Observable.Buffer

Sztuka programowania 4357 dni, 11 godzin, 55 minut temu pzielinski 38 źrodło rozwiń

Po przeczytaniu poprzednich wpisów, zasada działania i zastosowanie RX powinny być już jasne. Jeśli tak nie jest, koniecznie zachęcam do przeczytania tamtych postów. Jak wspomniałem, RX to ujednolicony model, umożliwiający korzystanie z kolekcji typu “push-based” w jednakowy sposób. Dzisiaj pokażę jak sprawa wygląda dla zdarzeń czyli jak skonwertować EventHandler do IObervable. Oczywiście kluczem do rozwiązania jest klasa Observable, która zawiera mnóstwo rozszerzeń dla interfejsów IObservable\IObserver...

Tagi: Rx, zdarzenia
Dziel się z innymi:
Piotr Zieliński » Reactive Extensions: Konwersja zdarzeń .NET do RX

Sztuka programowania 4359 dni, 11 godzin, 48 minut temu pzielinski 48 źrodło rozwiń

W poprzednim poście pokazałem jak dokonać subskrypcji aby otrzymywać powiadomienia o nowych danych oraz jak skonwertować IEnumerable to IObservable. Dzisiaj chciałbym pokazać kilka metod klasy Observable, które są szczególnie ważne przy pisaniu testów jednostkowych oraz przy nauce RX.  Muszę przyznać, że na co dzień korzystam wyłącznie tylko z kilku z nich ale w przypadku UnitTest’ów są już bardzo praktyczne. Observable to zbiór statycznych metod (często rozszerzających) usprawniających pracę z IOb...

Dziel się z innymi:
Piotr Zieliński » Reactive Extensions–jak wygenerować proste źródła danych

Sztuka programowania 4362 dni, 15 godzin, 5 minut temu pzielinski 93 źrodło rozwiń

Kiedyś już chciałem poprowadzić cykl wpisów o Reactive Extensions i nawet napisałem pierwszy post wprowadzający do interfejsów IObservable, IObserver. Niestety po drodze przytrafiły się tematy które chciałem najpierw opisać i na końcu zrezygnowałem z tego. W między czasie kilka osób pytało o ten cykl ale nie widziałem sensu ponieważ Maciej Zbrzezny już wykonał kawał dobrej roboty i  opisał to na swoim blogu w bardzo szczegółowy sposób. Dzisiaj postanowiłem jednak napisać kilka postów o RX po swojemu, z t...

Dziel się z innymi:
Piotr Zieliński » Reactive Extensions–wprowadzenie

Sztuka programowania 4368 dni, 15 godzin, 33 minuty temu pzielinski 111 źrodło rozwiń

W zeszłym tygodniu pisałem o zastosowaniu dynamicznych zmiennych. W dzisiejszym wpisie zastanowimy się co dokładnie CLR robi z dynamic i jak to wpływa na wydajność aplikacji. Pierwszy test polega na porównaniu wydajności dodawania dwóch liczb:privatestaticvoid TestStatic() { var stopwatch = Stopwatch.StartNew(); int a =10; int b =45; int c = a + b; stopwatch.Stop(); Console.WriteLine("Static:{0}", stopwatch.ElapsedTicks); } privatestaticvoid TestDynamic() { var stopwatch = Stopwatch...

Dziel się z innymi:
Piotr Zieliński » Słowo kluczowe dynamic: wydajność

Sztuka programowania 4371 dni, 23 godziny, 32 minuty temu pzielinski 97 źrodło rozwiń

Już kiedyś pisałem jak obsługiwać prawidłowe wyjątki ale dzisiaj jeszcze raz chciałbym rozwinąć temat. Zacznijmy od:privatestring GetData(int id) { string result=null; try { result = _service.GetData(id); } catch(Exception e) { } return result; } Jest to oczywiście skrajnie złe rozwiązanie ponieważ wszystko ignorujemy. Na szczęście programiści rzadko popełniają powyższy błąd. Niestety dużo częściej popełnianym błędem jest:privatestring GetData(int id) { stri...

Dziel się z innymi:
Piotr Zieliński » Code review: zła obsługa wyjątków

Wszyscy dążymy do oprogramowania, które zawsze działa ale oczywiście musimy przygotować się na przypadki w których wystąpił wyjątek i nie wiadomo jak go obsłużyć. Najgorszą reakcją jest oczywiście pozwolenie aplikacji dalej działać co może spowodować nieoczekiwane efekty oraz popsuć po prostu dane. Musimy wszystko zrobić aby nie dopuścić do niespójności danych. W przypadku gdy wiemy, że aplikacja nie może kontynuować swojego działania musimy bezwzględnie zakończyć cały proces albo AppDomain. Należy po pr...

Dziel się z innymi:
Piotr Zieliński » Zamykanie aplikacji w przypadku awarii: Environment.FailFast

Sztuka programowania 4377 dni, 15 godzin, 54 minuty temu pzielinski 128 źrodło rozwiń

Struktura Nullable jest już dobrze znana w świecie .NET. Pozwala na zasymulowanie wartości NULL dla typów prostych (value types). C# posiada jednak wiele ułatwień, które chciałbym opisać w dzisiejszym poście. Prawdopodobnie wiele czytelników korzystało z nich ale nie wiedziała, że to ułatwienie ze strony kompilatora a nie samej struktury Nullable. Zacznijmy od kodu źródłowego Nullable:[Serializable, StructLayout(LayoutKind.Sequential)] publicstruct Nullable

Tagi: C#, NULLABLE
Dziel się z innymi:
Piotr Zieliński » Jak CLR\C# ułatwia pracę z NULLABLE?

Inne 4380 dni, 16 godzin, 20 minut temu pzielinski 156 źrodło rozwiń

Dziś kolejny post z cyklu zastosowanie słowa kluczowego dynamic. Ostatnio pisałem o ExpandoObjet, który jest dynamicznym kontenerem na metody i dane. DynamicObject pozwala z kolei tworzyć wrappery na różne klasy. Zacznijmy od przykładu:internalclass Program { publicclass CustomWrapper : DynamicObject { publicoverridebool TryGetMember(GetMemberBinder binder, outobject result) { result ="Hello World"; returntrue; } publicoverridebool TrySetMem...

Tagi: C#, dynamicobject
Dziel się z innymi:
Piotr Zieliński » Zastosowanie dynamic: DynamicObject

Sztuka programowania 4384 dni, 5 godzin, 55 minut temu pzielinski 94 źrodło rozwiń

Kiedyś już wspomniałem o słowie kluczowych dynamic. W tym i następnych wpisach chciałbym przedstawić praktyczne zastosowanie tego mechanizmu. Na koniec wyjaśnię, jak dynamic jest zaimplementowany przez CLR i jak bardzo spowalnia aplikację… Programiści używający ASP.NET MVC z pewnością rozpoznają zasadę działania ExpandoObject. Klasa umożliwia tworzenie dynamicznych kontenerów. Na przykład:privatestaticvoid Main(string[] args) { dynamic bag =new ExpandoObject(); bag.FirstName ="Piotr"; bag.LastN...

Dziel się z innymi:
Piotr Zieliński » Zastosowanie dynamic: ExpandoObject

Sztuka programowania 4386 dni, 9 godzin, 29 minut temu pzielinski 109 źrodło rozwiń

Kilka postów wcześniej pisałem o różnicach między const a read-only. Dzisiaj  chciałbym pokazać scenariusz, który pokazuje kiedy NIE używać słowa const. Const jest doskonałym rozwiązaniem dla liczb, które są po prostu ZAWSZE stałe. Przykład? Liczba PI ma jedną wartość i oczywiście nigdy się nie zmieni. Istnieją jednak przypadki gdzie liczby w kodzie są zastępowane stałymi co nie zawsze jest dobrym wzorcem. Rozważmy, że mamy klasę przechowującą pewne parametry algorytmu:namespace ClassLibrary1 { publ...

Tagi: C#, readonly, stałe
Dziel się z innymi:
Piotr Zieliński » Kiedy stałe (const) są złą praktyką?

Sztuka programowania 4390 dni, 1 godzinę, 37 minut temu pzielinski 153 źrodło rozwiń

Dziś trochę o formatowaniu tekstu. Można je wykonać na wiele sposób. Osoby nie znające powyższych interfejsów zwykle tworzą własne metody zwracające wynik w odpowiednim formacie. Załóżmy, że mamy następującą klasę:class PhoneNumber { privatereadonlystring _extension; privatereadonlystring _phoneNumber; public PhoneNumber(string extension,string phoneNumber) { _extension = extension; _phoneNumber = phoneNumber; } } Na przykładzie powyższej klasy będę starał się po kolei pr...

Piotr Zieliński » Formatowanie tekstu oraz atrybuty IFormatProvider, IFormattable, and ICustomFormatter

Sztuka programowania 4391 dni, 16 godzin, 28 minut temu pzielinski 104 źrodło rozwiń

W C# istnieje wiele typów tablic. W poście chciałbym skupić się na ich wydajności. Rozważę następujące przypadki: - tablica wielowymiarowa, - tablica tablic tzw. jagged. - tablica unsafe. Tablice wielowymiarowe w c# są najwolniejsze ponieważ CLR nie wykonuje wszystkich optymalizacji. Zacznijmy jednak od testu:internalclass Program { privatestaticvoid DoSomething(int arg) { } privatestaticvoid MultiDimensionalArrayTest(int xCount, int yCount) { int[,] array =newint[xCount, ...

Dziel się z innymi:
Piotr Zieliński » Tablice danych: wydajność

Sztuka programowania 4395 dni, 12 godzin, 33 minuty temu pzielinski 153 źrodło rozwiń

Czasami metody mają zbyt dużo parametrów przez co wywołanie ich jest niewygodne i może zajmować nawet dwie linie. Oczywiście pierwsza rzecz, którą powinniśmy zrobić jest sprawdzenie czy metoda czasami nie wykonuje zbyt wielu operacji tzn. przestrzega zasadę Single Responsibility.  Jeśli mamy pewność, że metoda przestrzega wszelkie zasady i jest dobrze zaprojektowana wtedy trzeba pomyśleć jak zmniejszyć liczbę parametrów. W poście przedstawię kilka prób uzyskania takiego efektu. Logiczne wydaje się, utwo...

Tagi: C#, parametry
Dziel się z innymi:
Piotr Zieliński » Metoda z wieloma parametrami

Sztuka programowania 4397 dni, 12 godzin, 37 minut temu pzielinski 139 źrodło rozwiń

Dziś prosta zasada przekazywania parametrów ale jednak często łamana. Kod:privatestaticvoid Display(string[] strings) { foreach (string text in strings) { Console.WriteLine(text); } } Powyższa metoda ma za zadanie wyświetlenie wyłącznie elementów. Parametr wejściowy (tablica string’ów) jest zbyt specyficzny i nie pozwala na przekazanie wszystkich zbiorów danych. Na przykład poniższy kod nie skompiluje się:List

Tagi: C#, parametry
Dziel się z innymi:
Piotr Zieliński » Code Review: przekazywanie parametrów

Sztuka programowania 4400 dni, 9 godzin, 26 minut temu pzielinski 193 źrodło rozwiń

Przyjrzyjmy się następującemu fragmentowi kodu:publicclass SampleClass { privateint _value =10; } W rzeczywistości zostanie wygenerowany konstruktor, ustawiający pole value na 10. Kod IL:.method public hidebysig specialname rtspecialname instance void .ctor() cil managed { .maxstack 8 L0000: ldarg.0 L0001: ldc.i4.s 10 L0003: stfld int32 SampleClass::value L0008: ldarg.0 L0009: call instance void [mscorlib]System.Object::.ctor() L000e: nop L_000f: ret } Na...

Tagi: C#, konstruktor, pola
Dziel się z innymi:
Piotr Zieliński » Inicjalizacja pól a konstruktory

Sztuka programowania 4403 dni, 16 godzin, 12 minut temu pzielinski 63 źrodło rozwiń

W dzisiejszym wpisie chciałbym przyjrzeć się trochę bardziej tablicom i interfejsom jakie implementują. Zaglądając do dokumentacji dowiemy się, że Array implementuje:[SerializableAttribute] [ComVisibleAttribute(true)] publicabstractclass Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable IEnumerable nie powinno wydawać się dziwne ponieważ oczekujemy od tablic możliwości dostępu do elementów poprzez foreach:int[] numbers =new[] { 5, 2, 52, 5 }; foreach...

Tagi: C#, tablice
Dziel się z innymi:
Piotr Zieliński » Tablice – rzutowanie

Inne 4406 dni, 16 godzin, 40 minut temu pzielinski 106 źrodło rozwiń

1 2 3 4 5 6 7 8... 19 20

Najaktywniejsi w tym miesiącu