Jestem zwolennikiem terminologii angielskiej, czyli wszystkie identyfikatory w kodzie są w tym właśnie języku. Dzięki temu kod rzeczywiście jest samodokumentujący się, bo nie dławi go dysonans angielskiej składni i polskiej terminologii, który nieodwołalnie prowadzi do identyfikatorów typu „ponglish„, np. BeforeZapisz, RestoreZasoby...
Sztuka programowania 3052 dni, 3 godziny, 29 minut temu 131 źrodło rozwiń
Dziś mały eksperyment. Chciałbym pokazać jaki jest faktycznie spadek wydajności jeśli zachodzi potrzeba boxing’u i unboxing’u. Wiele o tym ostatnio pisałem ale nie pokazałem najważniejszego – liczb opisujących wydajność. Na początek porównanie boxing z unboxing:privatestaticvoid TestBoxingAndUnboxing() { object boxedValue =null; // boxing Stopwatch stopwatch = Stopwatch.StartNew(); for (int i =0; i < iterations;="" i++)="" {="" int="" unboxed="(int)" boxedvalue;="" }="" stopwatch.stop();="" ...
Sztuka programowania 3058 dni, 12 minut temu 90 źrodło rozwiń
W poprzednim poście napisałem kilka słów o dwóch sposobach wywoływania konstruktorów statycznych. Dziś chciałbym pokazać, że faktycznie ma to wpływ na wydajność. Rozważmy następujący przykład:publicclass BeforeInitSementics { publicstaticint Value =10; } publicclass PreciseSemantics { publicstaticint Value; static PreciseSemantics() { Value =20; } } internalclass Program { privateconstint Iterations =100000000; privatestaticvoid Test1() { // Precise ...
Sztuka programowania 3060 dni, 7 godzin, 20 minut temu 89 źrodło rozwiń
Konstruktory statyczne zwykłe służą do inicjalizowania pól statycznych lub walidacji typów generycznych np.:class Generic
Sztuka programowania 3063 dni, 6 godzin, 13 minut temu 110 źrodło rozwiń
Dziś w poście o kolejnej regule pisania dobrego kodu. Prawo Demeter mówi o relacjach między klasami a konkretnie o tym z jakimi obiektami dana klasa może komunikować się. W skrócie, prawo nakazuje odwoływanie się tylko do “bliskich przyjaciół” czyli obiektów, które są bardzo znane danemu obiektowi. Brzmi to trochę abstrakcyjnie dlatego przenieśmy to na świat programowania obiektowego. Każda metoda obiektu A może wywoływać wyłącznie metody następujących obiektów: 1. obiektów przekazanych jako parametr w...
Sztuka programowania 3066 dni, 5 godzin, 48 minut temu 177 źrodło rozwiń
Nie wiem, czy istnieje jakieś bardziej oficjalne tłumaczenie pure methods,więc aby uniknąć śmiesznych nazw przez resztę postu będę posługiwał się nazwą angielską. Nie chodzi mi o metody czysto wirtualne, które są powszechnie znane. W .NET istnieje atrybut PureAttribute, którym możemy oznaczać metody pure. Warto zacząć jednak od czystej definicji, czym jest metoda pure? W skrócie metoda pure nie zmienia stanu obiektu a jedynie operuje na parametrach wejściowych. Aby spełniać wymogi metod pure należy:Par...
Sztuka programowania 3069 dni, 20 godzin, 10 minut temu 156 źrodło rozwiń
Postem tym chciałbym rozpocząć mini cykl o zastosowaniu wzorców projektowych w języku JavaScript - wbrew pozorom, w tym języku również można je stosować! Na pierwszy ogień postanowiłem wziąć jeden z moich ulubionych wzorców - strategię. Myślę, że większość z nas, stosowała i stosuje ten wzorzec na co dzień (czasem nawet nieświadomie), jednak dla przypomnienia (za wikipedią): Wzorzec strategii definiuje rodzinę algorytmów, z których każdy zdefiniowany jest w osobnej klasie implementującej wspólny interf...
Sztuka programowania 3072 dni, 4 godziny, 45 minut temu 120 źrodło rozwiń
Opis, trzech wzorców asynchroniczności stosowanych w .net framework.
Sztuka programowania 3072 dni, 4 godziny, 45 minut temu 223 źrodło rozwiń
Klasa XmlSerializer służy do serializacji całych klas. Za pomocą atrybutu XmlIgnore można wykluczyć właściwości, których nie chcemy zapisywać. Problem pojawia się gdy w klasie pochodnej chcemy wykluczyć jakieś pola z klasy bazowej tj.:class Employee { publicstring FirstName { get; set; } } class Manager:Employee { //...} Serializaując Employee chcemy zapisać FirstName. Z kolei serializując Manger nie chcemy już tego robić. Jak uzyskać taki efekt? Dodając atrybut XmlIgnore w Employee spowoduje...
Sztuka programowania 3072 dni, 4 godziny, 45 minut temu 80 źrodło rozwiń
W C# można implementować interfejsy na dwa sposoby: jawny oraz niejawny. Rozważmy poniższy interfejs:interface ISerializable { void Serialize(string path); } Implementacja jawna:class ExplicitImplementation:ISerializable { #region ISerializable Membersvoid ISerializable.Serialize(string path) { thrownew NotImplementedException(); } #endregion } Implementacja niejawna:class ImplicitImplementation:ISerializable { #region ISerializable Membersvoid ISerializable.Serial...
Sztuka programowania 3075 dni, 6 godzin, 12 minut temu 130 źrodło rozwiń
Rozpoznaję taki jakby pattern przeładowanych metod dla string.Format(…). Jest wykorzystywany w wielu miejscach we Frameworku jak i poza nim. Chciałem zwrócić uwagę na ILog.DebugFormat() w bibliotece log4net oraz na Console.WriteLine().
Sztuka programowania 3075 dni, 6 godzin, 12 minut temu 109 źrodło rozwiń
Życie programisty byłoby prostsze, gdyby zawsze używał explicite CultureInfo gdy korzysta z ToString() oraz string.Format(...).
Sztuka programowania 3076 dni, 13 godzin, 42 minuty temu 140 źrodło rozwiń
O strukturach na blogu pisałem już wielokrotnie m.in.: “Klasy i struktury w C#”, “Dlaczego struktury nie mogą posiadać konstruktora bez parametrów?”, “StructLayout – wprowadzenie”, “StructLayout–zastosowanie”. W pierwszych z tych postów, przedstawiającym różnice między klasami a strukturami napisałem, że co prawda struktury nie mogą dziedziczyć po klasach ale mogą za to implementować interfejsy. Dzisiaj chciałbym rozszerzyć to o kilka słów gdyż w tamtym wpisie ograniczyłem się tylko do stwierdzenia, że j...
Sztuka programowania 3078 dni, 10 godzin, 35 minut temu 98 źrodło rozwiń
W zeszłym tygodniu na dotNETomaniaku wypromowano artykuł na temat interfejsów. Zapoznałem się z nim i odnoszę wrażenie, że autor nie rozumie w pełni roli interfejsu i myli go z klasą bazową. O taką pomyłkę rzeczywiście nietrudno, wiele klas buduje bowiem swoją funkcjonalność na podstawie interfejsów, ale to nie oznacza automatycznie, że interfejs jest ich przodkiem, zaczynem. Trzeba zacząć od tego, że choć interfejs umieszcza się w definicji klasy tak samo jak klasę dziedziczoną...
Sztuka programowania 3082 dni, 1 godzinę, 11 minut temu 97 źrodło rozwiń
Wyrażenia lambda są łatwe w użyciu, ale jak to bywa z takimi ułatwieniami również nieświadomie można spowodować poważne problemy. Przykład:class SampleClass { } class Factory { private Type _type =typeof (SampleClass); public Func
Sztuka programowania 3084 dni, 13 godzin, 7 minut temu 143 źrodło rozwiń
Kolejna część artykułu o dobrych i złych praktykach. Zapraszam do lektury: http://msdn.microsoft.com/pl-pl/library/dobre-i-zle-praktyki-w-c-sharp–czesc-6.aspx
Sztuka programowania 3087 dni, 13 godzin, 12 minut temu 348 źrodło rozwiń
Notacja węgierska to ZŁOOOOOO! Słychać to ze wszystkich stron i trudno się z tym nie zgodzić. Przedrostki nazw identyfikatorów określające typy takiego identyfikatora nigdy nie były jakimś nowatorskim rozwiązaniem – prędzej protezą. Czy oznacza to jednak, że całość tego pomysłu należy odbierać negatywnie? W mojej opinii nie. A dlaczego - o tym tenże wpis.
Sztuka programowania 3087 dni, 13 godzin, 12 minut temu 148 źrodło rozwiń
Wracając jeszcze do filozofowania o kodzie, dziś trochę o cechach klas, a dokładniej: pola i właściwości. Zanim wymyślono idee właściwości dostęp do pól odbywał się na dwa sposoby. Pole w klasie (np. name) mogło być publiczne i każdy miotał nim jak szatan, druga opcja to dostęp kontrolowany przez parę metod typu GetName i SetName. Umożliwiały one kontrolowanie tego kto i na jakich zasadach może korzystać z cech wewnętrznych klasy. Później, aby pominąć pisanie GetName/SetName, wymyślono właściwości, któr...
Sztuka programowania 3087 dni, 13 godzin, 12 minut temu 144 źrodło rozwiń
O interfejsach napisano już wiele artykułów. Postaram się dlatego podejść do tego zagadnienia od innej strony. Na początek pytanie: czym różni się metoda wirtualna od implementacji metody z interfejsu? Mogło by się zdawać, że są to bardzo podobne operacje.
Sztuka programowania 3089 dni, 7 godzin, 21 minut temu 197 źrodło rozwiń
O zdarzeniach było już wielokrotnie na blogu. Pokazywałem różne sposoby wywołania zdarzeń. Najpopularniejszym chyba sposobem jest poniższy wzorzec:publicclass Person { publicevent EventHandler FirstNameChanged; virtualprotectedvoid OnFirstNameChanged(EventArgs e) { if (FirstNameChanged !=null) FirstNameChanged(this, e); } } Jeśli wielowątkowość wchodzi w grę wtedy lepiej napisać:publicclass Person { publicevent EventHandler FirstNameChanged; virtualprotectedvoid O...
Sztuka programowania 3090 dni, 14 godzin, 9 minut temu 99 źrodło rozwiń