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 ...
Strona głównaUżytkownik
pzielinski | użytkownik
Sztuka programowania 4381 dni, 13 godzin, 18 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 4384 dni, 12 godzin, 11 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 4387 dni, 11 godzin, 46 minut temu 178 ź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 4391 dni, 2 godziny, 8 minut temu 156 ź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 4393 dni, 10 godzin, 43 minuty temu 82 ź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 4396 dni, 12 godzin, 10 minut temu 135 ź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 4399 dni, 16 godzin, 33 minuty temu 99 źrodło rozwiń
O dwóch sposobach inicjalizacji właściwości obiektu pisałem już tutaj. Dziś chciałbym pokazać jak zainicjalizować kolekcję używając “nowego” mechanizmu wprowadzonego w C# 3.0. Z poprzedniego post’a wiadomo, że właściwości można ustawiać tak:internalclass Person { public Person() { } public List
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 4405 dni, 19 godzin, 5 minut temu 144 ź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 4408 dni, 19 godzin, 10 minut temu 350 ź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 4411 dni, 20 godzin, 7 minut temu 99 źrodło rozwiń
Zdarzenia stanowią bardzo wygodny mechanizm monitorowania stanu obiektów. W .NET można spotkać je na każdym kroku. Kontrolki zarówno w WinForms jak i WPF, posiadają wiele zdarzeń, często kilkadziesiąt. Niestety każda deklaracja zdarzenia pochłania zasoby. Nie ma to znaczenia gdy obiekt posiada tylko kilka zdarzeń ale może to być zauważalne dla skomplikowanych klas np. kontrolek w WinForms. Każda kontrolka eksponuje dziesiątki zdarzeń a użytkownicy zwykłe korzystają wyłącznie z kilku – rzadko ma miejsce s...
Sztuka programowania 4414 dni, 20 godzin, 9 minut temu 121 źrodło rozwiń
Kod:
sealed class FolderFilesMappings : Dictionary
Sztuka programowania 4416 dni, 10 godzin, 46 minut temu 157 źrodło rozwiń
Zaczynamy od próbki kodu:staticclass StringExtensions { publicstaticvoid SayHello(thisstring str, string message) { Console.WriteLine(string.Format("Hello:{0}", message)); } } internalclass Program { privatestaticvoid Main(string[] args) { string str =null; str.SayHello("Piotr"); } } Co według Was wydarzy się po uruchomieniu programu? Na pierwszy rzut oka może wydawać się, że wystąpi NullReferenceException ponieważ wywołujemy metodę na nieistniejącym obi...
W C# typy proste przekazywane są przez wartość. Oznacza to, że za każdym razem wszystkie bity są kopiowane. Ponadto jakiekolwiek operacje dokonywane na takim polu, nie są widoczne na zewnątrz, na przykład:internalclass Program { privatestaticvoid Increment( int value) { value++; } privatestaticvoid Main(string[] args) { int value =5; Increment(value); Console.WriteLine(value); } } Czasami zachodzi potrzeba przekazania wyniku z powrotem albo ze wz...
O modyfikatorze sealed już kiedyś pisałem – dzięki niemu możemy zabronić dziedziczenia po danej klasie:sealedclass SealedClass { } class ChildClass:SealedClass // BLAD{ } Moim zdaniem jest on niedoceniany i zbyt rzadko używany. Może dlatego, że nie wnosi on nic nowego do funkcjonalności czy łatwości w pisaniu kodu a “jedynie” stanowi ważny element w projekcie oraz w tym, jak inni użytkownicy z takiej biblioteki będą korzystać. Pierwszą zaletą SEALED jest wydajność. Oczywiście w większości przypadkó...
Sztuka programowania 4428 dni, 8 godzin, 46 minut temu 240 źrodło rozwiń
Praca z obiektami COM może być trudna i czasami frustrująca. Przykład:Worksheet sheet = excelApp.Worksheets.Open(...); // Jakaś logika. Odczytywanie lub modyfikacja arkusza itp.Marshal.ReleaseComObject(sheet); Marshal.ReleaseComObject(excelApp); O obiektach COM należy pamiętać, również po zakończeniu pracy z nimi – należy zwolnić wszelkie zasoby. Nie zawsze jest to proste i oczywiste. Powyższy kod spowoduje memory leak ponieważ Worksheets również musi zostać zwolniony. Metoda Open jest wywołana na ob...
Programowanie rozproszone 4428 dni, 16 godzin, 50 minut temu 124 źrodło rozwiń
Dziś trochę o podstawach C# ale myślę, że wszyscy znajdą coś wartościowego w tym wpisie bo chcę pokazać jak to działa od środka CLR. Na początek przykład boxing’u:staticvoid Main(string[] args) { int value =3; object referencedType = value; } Boxing to nic innego jak utworzenie typu referencyjnego na podstawie value type. Object to typ referencyjny przechowywany na stercie, z kolei integer to zwykły value type przechowywany na stosie. Opisowo, boxing składa się z 3 operacji:Alokacja pamięci na s...
Sztuka programowania 4431 dni, 17 godzin, 22 minuty temu 132 źrodło rozwiń
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 4434 dni, 18 godzin, 4 minuty 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 4437 dni, 9 godzin, 13 minut temu 307 źrodło rozwiń