ZmienneCzęść NR.1Witam w nowym cyklu w którym szybko będę omawiał składnie języka C#, Java bez zbędnego opisu. Typ wartościowy i typ referencyjny? Nie będzie takich opisów bo mówimy tutaj o składni języka. . Zauważyłem, że 70% ruchu na moje stronie dotyczy wpisów z C# dla początkujących więc kto wie może to nie jest taki głupi pomysł.

Obliczyłem, że ten cykl zajmie 27 wpisów, ale przy dobrym planie powinien zakończyć ten cykl.

ZeroC IceSystemy rozproszone. Jak systemy napisane w różnych środowiskach programistycznych i językach mają się ze sobą komunikować. Usługa sieciowa SOAP bądź RES brzmi sensownie. W drugim semestrze moich studiów magisterski musiałem napisać na zaliczenie różne sposoby komunikacji. Uczelnia PJWSTK jest głównie ustawiona na Jave a co zatem idzie na rozwiązanie CORBA polegającą na komunikacji pomiędzy środowiskami na bardzo niskim poziomie. Jest to szybsze rozwiązanie niż SOAP i REST.

WhereW .NET istnieje wiele technik do iteracji i wybierania danych z kolekcji. Najlepszym wynalazkiem C# jest LINQ.

Zostałem poproszony o stworzenie prostego przykładu LINQ, który by po prostu pobierałby elementy kolekcji w zależności od naszych potrzeb. Nie mam dużo czasu by się rozpisywać więc pomyślałem czemu nie.

Ten wpis jest przeznaczony całkowicie dla początkujących.

RandomKiedyś na blogu zrobiłem wpis o procedurze SQL Server, która zwraca losowe znaki.

Jak stworzyć podobny generator losowych znaków w C#?

Istnieje wiele możliwości.

ConvertAllSłyszałeś o metodzie ConvertAll bo ja nie xD . Jak sama nazwa metody wskazuje ta metoda konwertuje wszystkie elementy kolekcji na inny typ danych. Zwykle do utworzenia nowej kolekcji używam pętli foreach. LINQ daje nam jednak alternatywę i krótszą składnie. Rodzi się jednak pytanie czy w ogóle ta metoda jest nam potrzebna gdyż ten sam rezultat możemy otrzymyać używając metody Select

Null ToString

Pisząc pewien zawansowany program w pracy zdałem sobie z czegoś sprawę.

W kodzie nie raz widziałem takie konstrukcje.

 

int? myInt = null;
string test = myInt.HasValue ? myInt.Value.ToString() : string.Empty;

Dlaczego jednak nie użyć po prostu bezpośredniego odwołania ToString().

ReflectionCzęść NR.6Prawdopodobnie ostatni wpis z tego cyklu. Uczę się Objective-C od dwóch tygodni po godzinach ale tempo nauki musi zostać jeszcze bardziej zwiększone.

Chociaż być może jeszcze napiszę o rzutowaniu. Podstawy refleksji przydają się na codziennie w programowaniu. Jak więc refleksja wygląda w Objective-C.

Add whiteW tym wpisie dodam białe znaki do dużych liczb tak aby były one bardziej czytelne.

Czyli chcemy sformatować liczbę 1000000000 do takiej postaci “1 000 000 000”. Dodatkowo chce dać użytkownikowi możliwość ustalenia co ile znaków ma się pojawiać znak spacji.

StringCzęść NR.2Naukę Objective-C można zacząć od rzeczy najprostszy dlaczego więc nie zacząć od napisów

Podobnie jak w poprzednim wpisie użyje przykładu z C# i Objective-C dla porównania. Uznałem także ,że nie będę tracił czasu na zbędne opisy kodu.

StartCzęść NR.1 Zawodowo programuje w C# od 2 lat. Licząc czas spędzonych na studiach z C# ten czas wydłuża się przynajmniej dwukrotnie.  Aby pisać aplikacje na iOS bez pomocy firmy Xamarin trzeba oczywiście znać Objective-C.

Czasu do nauki tego języka mam niewiele i jest to spore wyzwanie dla mnie biorąc pod uwagę, że jest praca na drugi etat.

C#

F# DLL -> C# Krótki tutorial o tym jak wykorzystać kod napisany w F# w C#

Krok pierwszy. Utwórz projekt “F# Library Project”. Nazwij go przykładowo “FsharpTestDLL”.

LockSłowo kluczowe “lock” oznacza część krytyczną kodu, która zablokuje przepływ kodu dla innych wątku ,aż do jego zwolnienia.

Wewnątrz części krytycznej zabezpieczam kod, który mógłby zachowywać się nie przewidywalnie gdyby wiele wątków na raz próbowało wykonać jedną i tą samą operację.

Awaiting XNauka “async i await” się nie kończy. Co można jeszcze zrobić przy pomocy tych słów kluczowych.  W WPF w prosty sposób możemy zwolnić wątek UI. W WCF możemy łatwo przejąć kontrolę nad wiadomościami zwrotnymi usługi. To jednak nie koniec.

Video IDW poprzedniej pracy kiedyś dawno temu dostałem takie zadanie. Polegało ono na stworzeniu kodu, który by wyciągał “id-ki” z filmików z Youtube.

Sprawa nie jest prosta ,a czas jaki dostałem na to zadanie był zdecydowanie za krótki.

Analiza Parsowanie HTML-a  nie jest prostą sprawą. HTML nie ma jednolitej składni i nie może być potraktowany jak plik XML. Napisanie swojego parsera też nie jest łatwe. Analiza HTML przy użyciu wyrażeń regularnych jest jeszcze gorszym koszmarem.

Na szczęście jak to w programowaniu bywa ktoś już dużo wcześniej opracował rozwiązanie i się z nim podzielił. W tym wpisie omówię bibliotekę HTMLAgilityPack.

WPF AsyncAsync i Await to całkiem nowy fantastyczny bajer   który został dodany do języka C# całkiem nie dawno. Można go używać w każdej aplikacji .NET-owej chociaż  małe różnice w wykorzystaniu istnieją to sumie filozofia działania jest ta sama .

Ciężko jest wyjaśnić co dokładnie dzieje się pod spodem aplikacji,  która korzysta z tej funkcjonalności.

Mind F###Na rozmowach kwalifikacyjnych osoby rekrutujące lubią zadawać podchwytliwe  pytania. Przykładowo  przed każdą rozmową kwalifikacyjną z Javy warto byłoby sobie przypomnieć jak działają metody porównywania napisów.

Ich działanie nie jest takie intuicyjne jak się wydaje.  Oto poniższy przykład. Sprawdź swoją wiedzę i sprawdź czy rozumiesz poniższy przykład.

Odliczamy Możesz stworzyć statyczną zmienną DateTime do swojego projektu i przechowywać w niej czas uruchomienia aplikacji poprzez uzupełnienie jej datą w głównym konstruktorze aplikacji.

Później tą zmienną porównujemy z obecnym czasem ,aby otrzymać okres w jakim działała aplikacja.

Losowość W niektórych przypadkach klasa Random nie wystarcza do generowania losowych liczb. Problematyka generowania losowych wartości polega na tym ,że są one generowane według określonego wzoru.

Co oznacza , że tak naprawdę są one liczbami pseudo-losowymi. Jeśli ten wzór nie jest dobry wtedy nasza“losowość” nie jest aż taka bardzo “losowa”.

Taka losowość jest w porządku jednak w większości przypadków wciąż nie można jej porównać do rzutu kostką, czy monetą.

Sort Linq W tym wpisie opiszę program który:

 

Tworzy obiekt klasy “Person”, która reprezentuje osobę z rolą i imieniem.

  • Wyświetla kolekcje List<Person> w kontrolce GridView na stronie ASP.NET.
  • Sortuje kolekcje rosnąco i malejąco po jej właściwościach przy użyciu własnych metod bazujących na LINQ.

Z góry także mogę obiecać ,że rozbuduję ten program ponieważ ostatnio w mojej pracy musiałem napisać bardziej zawansowaną wersję takiego sortowania. Chciałbym zachować zdobytą wiedzę w moich notatkach.

Na początek zacznijmy od klasy “Person” , która będzie reprezentować encje osoby. Posiada ona tylko dwa pola: nazwę i rolę. Nie ma tutaj żadnej rewelacji chcę uprościć ten przykład aż do bólu.

String / Enum Nie ma wbudowanego rzutowania z napisu string na wartość wyliczeniową. Nie można też takiego rzutowania jawnego napisać.(albo tylko tak mi się wydaje) Problem polega na tym ,że string jest klasą ,a enum jest strukturą. Co oznacza ,że konwersja taka nie powinna istnieć. Jest to nawet określone w standardzie języka C#.

yield

Jak pokazałem w poprzednim wpisie proces tworzenia kolekcji wyliczeniowej jest złożony. W C# istnieją jednak iteratory, które potrafią zautomatyzować ten proces.

Iterator jest to blok kodu, który uzyskuje (yield) w odpowiedniej kolejności wartości. Dodatkowo iterator nie jest częścią klasy wyliczeniowej. Określa on tylko sekwencje, w której enumerator powinien zawracać wartości. Czyli iterator jest tylko opisem sekwencji wyliczania dzięki któremu kompilator w C# może stworzyć swój własny enumerator.

IEnumerable

Używając pętli foreach mogę przez iteracje uzyskać dostęp do każdego pojedynczego elementu w kolekcji. Co się dzieje w środku pętli i jak to jest możliwe. Ta tematyka jest istotna, gdy chcesz stworzyć swoją własną kolekcje i przekonując się ,że mechanizm pętli foreach nie zostanie dodany automatycznie.

W C# istnieje kilka sposobów na zautomatyzowanej tego procesu.

Covariant

Obiekt może przetrzymywać jakąkolwiek wartość bądź referencje do każdego typu.

Poniższy kod jest OK


int myNumber = 12;
string myString = "Moto-myszy z Marsa";
object myObject = myNumber;
object myObject2 = myString;

Pamiętaj, że klasa string dziedziczy po klasie Object, więc wszystkie klasy String są obiektami. Struktura nie może dziedziczyć po klasie ale istnieją pewne wyjątki na poziomie wbudowanej kompilacji. W pewnym sensie struktura int dziedziczy po object, więc ona też może być umieszczona w object. Jednakże, w “pewnym sensie”nie jest to, tak do końca prawdą, gdyż int jest typem wartościowym i ta różnica później będzie istotna.

Generic

Poprzednim razem utworzyłem własną klasę generyczną, która działa jak drzewa binarne. W .NET można też utworzyć generyczną metodę od T.

W generycznej metodzie możesz określić typ parametrów i typ zwracany jako T, w podobny sposób jak wcześniej użyłem tego zapisu do deklaracji klasy generycznej.

Generyczne metody są zazwyczaj używane w połączeniu z generycznymi klasami. W końcu, w takich metodach zazwyczaj parametrem i typem zwracanym jest klasa generyczna.

Generyczne metody są definiowane w podobny sposób, jak generyczne klasy. Na przykład, możesz użyć metody Swamp<T> , która zamienia wartości pomiędzy parametrami. Ta funkcja jest użyteczna bez względu na typ danych. Sama metoda może też być statyczna.

Generic Class NET zawiera wiele klas generycznych. Do pokazania, definiowania własnych klas generycznych używa się często tego samego przykładu: drzew binarnych. Nie ma takiej klasy w .NET, która zachowywałaby się jak drzewa binarne. Tak jak powiedziałem wcześniej ten przykład jest często używany, więc nie widzę powodu abym sam tego nie zrobił. Jednak zanim przejdziemy do tworzenia klasy generycznej najpierw opowiem trochę o drzewach binarnych.

ŚciągaCzęść NR.23Kurs dobiegł końca. Przyszedł czas na podsumowanie jego zawartości w pigułce. W sumie w tym kursie chciałem napisać jeszcze o innych rzeczach jak: indeksory , tworzenie własnych kolekcji od <T> czy jak efektywnie korzystać z innych słów kluczowych. Kurs jednak zrobił się za długi i nawet jego nazwa “obiektowość” nie jest do końca już trafna.

Indeksery i []Część NR.3

Zostawiając już bity w int-ach przejdę do innego wykorzystania indekserów (czy jak to się odmienia w języku polskim). Zanim stworzę swój przykład zbliżony do działania HashTable napiszę dlaczego indeksory są w ogóle używane w takich wypadkach.

Jest możliwe dla właściwości aby zwracała ona tablicę ,ale pamiętaj o tym ,że tablica jest typem referencyjnym więc poprzez udostępnianie tablicy w bezpośredni sposób narażasz na przypadkowe nadpisanie danych.

Oto przykład struktury, która udostępnia tablicę int dla właściwości, którą nazywałem Dane:

IndekseryCzęść NR.2

W poprzednim wpisie pokazałem jak operować bitami za pomocą odpowiednich operatorów.

Zatrzymajmy się na chwilę i przypominajmy sobie na czym polega problem.

Chcemy użyć typu intjako tablicy, która przechowuje bity. W podobnym stylu typ string to tablica znaków. Przykładowo gdybym chciał uzyskać dostęp do 6 miejsca bitowego zrobiłbym to tak.

BitoweCzęść NR.1Co to są indeksery poza tym, że nie ma takiego polskiego słowa w słowniku.

O indekserach można pomyśleć jako o małej tablicy, która działa w podobny sposób do właściwości. Przechowują one jednak grupę wartości. Gdy właściwość odnosi do jednego pola w klasie, indeksery hermetyzują i odnoszą się do całej grupy wartości. Kod, który wyraża indekser jest podobny do stylu użycia tablicy.

Najlepszym sposobem na zrozumienie jak one działają jest pokazanie przykładu. Na początku pokażę rozwiązania, które ich nie używają ,abyś lepiej zrozumiał po co one są.

Problem dotyczy liczb całkowitych a mówiąc bardziej dokładnie typu int.

params

W tym wpisie dowiesz się:

Jak napisać metodę, która akceptuje jakąkolwiek liczbę argumentów używając słowa kluczowego params.

 

Tablica parametrów jest użyteczna jeśli chcesz napisać metodę, która pobiera jakąkolwiek liczbę parametrów, możliwe innych typów. Znając koncept obiektowości ta koncepcja może wydawać się   nie trafiona. W końcu obiektowo zorientowane rozwiązania takich problemów polegaja na przeciążaniu metod.
Przeciążanie metod pozwala nam na deklarowanie dwóch lub więcej metod, które mają taką same nazwę w danym zakresie. Mechanizm przeciążania jest użyteczny jeśli chcesz przeprowadzić tę samą akcje dla różnych argumentów.

Mimo iż ten mechanizm jest użyteczny zdarzają się przypadki, w których nie zawsze sobie radzi.

DestruktorCzęść NR.22 Jak pamiętasz typy wartościowe są tworzone na stosie ,a typy referencyjne są umieszczane na stercie. Komputery nie mają nieskończonej pamięci więc pamięć musi zostać odnowiona kiedy dana zmienna bądź obiekt nie jest już potrzebny. Typy wartościowe zostają zniszczone wraz ze swoją pamięcią kiedy wychodzą poza zakres.

Zmienne są tworzone np. w czasie metody więc znikają po jej wykonaniu.

Poza tym typy wartościowe nie przechowują dużo informacji więc nie ma z nimi dużego problemu.

Ale co z typami referencyjnymi . Tworzysz obiekt za pomocą słowa kluczowego new ,ale jak obiekt jest niszczony w C#. Przekonajmy się.

GenericsCzęść NR.21

Podczas kursu była mowa o tablicach, które są stworzone do przechowywania typów wartościowych. Przy typach referencyjnych wykonuje się pakowanie i używanie tablic ich traci sens. Tablice mają określoną wielkość i aby ją zmienić trzeba stworzyć ją od nowa.

Klasy z System.Collection jak ArrayList czy HashTable przechowują wszystko jako obiekty więc pakowanie i wypakowywanie zawsze zachodzi bez względu na to, czy jest to typ wartościowy, czy też nie. Mimo, iż są elastyczne z powodu przechowywania wszystkiego jako obiekt możemy zderzyć się z błędem przy rzutowaniu.

Od C# 2.0 mamy do dyspozycji jeszcze inne klasy kolekcji i są one najczęściej używane.

ZdarzeniaCzęść NR.20 Zobaczyłeś już jak zadeklarować delegat i jak jej użyć.

Widziałeś też co potrafią wyrażenia lambda w C#.
Jednak to jeszcze nie koniec. Co prawda możesz wywołać wiele metod nie bezpośrednio za pomocą delegaty, ale wciąż musisz ją wywołać jawnie.

Z programistycznego punktu widzenia dobrze byłoby , aby delegaty uruchomiały się automatycznie gdy coś ważnego się wydarzy.

Przykładowo, w przypadku przegrzewania się reaktora atomowego wywołać odpowiednią delegate, która wykona wszystkie metody po kolei w celu jego wyłączenia .

LambdaCzęść NR.19Przykłady z poprzedniego wpisu dodają do delegaty konkretne metody. Dla przypomnienia prosty przykład użycia delegaty.

Jeśli Google odesłało cię tutaj po informacje o tym jak korzystać z delegat, to polecam poprzedni wpis kursu.

Klasa MaszynaPracująca ma do dyspozycji pewien zestaw metod.

DelegatyCzęść NR.18Jak do tej pory widziałeś kod wykonujący się sekwencyjnie linijka po linijce. Spokojnie na programy wielowątkowe jest jeszcze za wcześnie ,ale zapewne zastanawiałeś się jak działają np. zdarzania w WPF.

[Wpis nadpisany 2015-01-15]

Przepływ programu, w takim wypadku na pewno nie jest jednokierunkowy.

MetodyCzęść NR.2Kiedyś komputery były tylko maszynami, które manipulowały wyłącznie wartościami liczbowymi. Pierwsze super komputery obliczały tor lotu pocisków jak i łamały szyfry.

To było kiedyś, komputery dzisiaj, chociaż nikt nie prowadzić statystyk w tym kierunku, pracują w większości nad manipulacją napisów.

Czy to jest dokument tekstowy, czy strona internetowa operacje na napisach powszechnie występują.

WłaściwościCzęść NR.15Hymn właściwości to ważny aspekt. Jak zauważysz pola w klasach .NET są zawsze prywatne natomiast właściwości udostępniają nam zmienne. Chociaż na potrzeby tego kursu na pewno zdarzały się sytuacje, w których pola w klasie czy strukturze były publiczne ,ale nie jest to poprawne zachowanie.

Kiedy chcesz przeczytać bądź zapisać zmienną zazwyczaj używasz symbolu przypisania czyli znaku równa się ( = ). Dlatego stosowanie metod do wyświetlenia zawartości pól nie jest takim dobry pomysłem. Jest to wykonalne ,ale efekt nie jest taki zadowalający.

Oto przykład. Jak widzisz ilość kodu jest dość duża. Zrobiłem to specjalnie by wykazać ,że to podejście jest również słabe, właśnie z powodu ilości kodu.

DziedziczenieCzęść NR.11Jest to kurs obiektowości , a jeszcze nie było mowy o dziedziczeniu w C#. Chociaż dziedziczenie i polimorfizm pojawiały się w niektórych miejscach w innych wpisach.

Dziedziczenie to kluczowy mechanizm obiektowości. Dziedziczenie pozwala na powielanie funkcjonalności wobec różnych klas w ten sposób nie musimy pisać ciągle samego kodu. .

TabliceCzęść NR.9Tablica pozwala na przechowywanie zbioru wartości. W programowaniu mamy wiele sposobów przechowywania kolekcji wartości ,a tablice są jednym z tych sposobów.

Tablice mogą przechowywać tylko jeden określony typ wartości. NP. tablicaint będzie mogła przechowywać tylko liczby tego typu.

W teorii tablica typu objectmoże przechowywać wszystkie typy ale odpakowywanie(unboxing) wartości z takiej tablicy może okazać się dość kłopotliwe.

StrukturaCzęść NR.8 Klasy są typami referencyjnymi i ich zawartość jest zawsze tworzona na stercie. W niektórych wypadkach klasa zawiera tak niewielką ilość danych , że zarządzanie nimi na stercie jest nieopłacalne. W takich wypadkach lepiej użyć struktury.

Struktura jest typem wartościowym czyli jej miejsce jest na stosie.

Chociaż jeśli struktura jest duża to lepiej stosować klasy.

EnumCzęść NR.7Typ wyliczeniowy, na który często mówię Enum (szkoda , że ta nazwa nie może być przyjęta Puszczam oczko) jest jedną z fajniejszych rzeczy w programowaniu. Dlaczego?

Choćby dlatego , że wyklucza wartości, których nie chcemy. Przykładowo do aplikacji chcemy aby użytkownik podał konkretny miesiąc ponieważ nasza zmienna byłaby typem wyliczeniowym , a nie np. stringiem .

Nie byłoby mowy o podaniu niewłaściwej wartości ponieważ sprawnie byśmy je przechwytywali.

Typy wyliczeniowe przydatne są także przy kontrolkach, jak ComboBox ponieważ z góry wiemy, jakie pola może użytkownik wybrać.

Jednym słowem zamiana niektórych zmiennych z string na typ wyliczeniowy może bardzo usprawnić aplikacje. 

StatycznaCzęść NR.2

Przykładem klasy statycznej jest np. klasaMath , która zawiera wszystkie potrzebne funkcje matematyczne jak np. cosinus. Do ich użycia klasa nie musi być zadeklarowana o czym więcej w tym wpisie.

Klasa statyczna Math
Na pewno zauważysz ,że nie wszystkie metody należą do instancji klasy; są to metody, które wykonują swoje cele w sposób niezależny od specyfikacji zainicjalizowanej klasy. To są metody statyczne. Po co one są?

Klasy w C#Część NR.1 Ostatnio skończyłem kurs: podstawy C#.Jednak nie było w nim nic o klasach i obiektach. Do pisania prostych programów rzeczywiście można się obyć bez klas. Jednak nie bez powodu C# jest językiem obiektowym .Nikt też nie da nagrody za napisanie programu, który dodaje dwie cyfry. Poprzedni kurs był dobry jako wstęp ,ale nie zmienia to faktu ,że trzeba jeszcze bardziej poszerzać wiedzę.

C# nie jest trudnym językiem programowania ,więc moim zdaniem nie będziesz miał z tym kursem dużych problemów.

Platforma .NET zawiera tysiące klas i nawet jeśli jesteś początkującym programistą C# na pewno zetknąłeś się z nimi. Klasy tworzą dobry mechanizm w zarządzaniu i modelowaniu encji manipulowanymi przez aplikacje. Encja może reprezentować określony przedmiot jak produkt, bądź pracownika albo nawet transakcjeEncje Klasy.

W zależności od naszego poziomu abstrakcji encje mogą prosto obrazować rzeczywistość bądź tworzyć cały złożony system.
Obiekty klas też mają różną długość życia. Niektóre obiekty służą do przechowywania informacji przez prawie cały proces aplikacji ,a niektóre z nich są usuwana zaraz po ich użyciu.

Co to znaczy?W C# mamy do dyspozycji operatory jednoargumentowe jak inkrementacja i dekrementacja. (i++,i--). Mamy też operatory dwuargumentowe, które głównie wykonują podstawowe operacje arytmetyczne (a+b). Czasami w przykładach kodu z Internetu  spotykałem się z wyrażeniem trójargumentowym. Jest ono trochę nieczytelne ,ale na pewno skraca kod o niepotrzebną  if,else.

Operator wygląda tak.

WyjątkiCzęść NR.7The-Hangover-2-Poster-01Nikt nie jest w stanie przewidzieć działań użytkownika. Gdy tworzymy program zwykle jesteśmy przygotowani na scenariusz absolutnie zgodny z zastosowaniem aplikacji ,jednak co się stanie jeśli w miejscu Y napiszę X.

Ten X nie ma żadnego zastosowania z punktu widzenia programu ,ale nie zmienia to faktu ,że powoduje on jego blokadę. Gdy w textboxie pobieramy liczby musimy być przygotowani na to ,że użytkownik nie podał wartości liczbowej. Gdy otwieramy w aplikacji plik graficzny musimy być przygotowani na to ,że użytkownik wybrał przez przypadek plik tekstowy i tak dalej.

MetodyCzęść NR.6time_paradoxPętle w programowaniu są powszechne gdyż wykonywanie jakiejś czynności X razy z innymi parametrami jest na porządku dziennym.

Oczywiście zmorą każdego początkującego programisty jest fakt ,że pętle muszą się kiedyś skończyć.

WarunkiCzęść NR.5Programy służą do rozwiązywania złożonych problemów. W tym celu program nie może działać liniowo. Niczym gra Visual Novel, w której w zależności od podjętej przez nas decyzji na ekranie komputera oglądamy inny tekst.

Myślę ,że jest to najlepszy przykład. W takiej grze istnieją proste zmienne bądź liczniki punktów, które decydują o tym co później się wydarzy.

Potem za pomocą twierdzeń decyzyjnych zawartych w programie zmienne przekierowują nas do odpowiednich scen w grze.

Na tym przykładzie przedstawionym na ilustracji postać w garniturze o imieniu “Enomoto” pyta, czy słyszałem o kwantowej teleportacji? . Jeśli odpowiem “tak” to zostanie pominięta cała scena (jak nie rozdział) tłumacząca co to jest kwantowa teleportacja.
Twierdzenia decyzjne
Mam nadzieje ,że przykład spodobał się . Każdy program działa w zależności od decyzji użytkownika. Nasz poprzedni przykład aplikacji WPF obliczał wynik w zależności od wciśniętego przycisku ,ale ile musielibyśmy mieć przycisków do każdej operacji matematycznej. Tymczasem każdy wie ,że w kalkulatorze jest jeden przycisk “równa się", który wszystko zatwierdza .

Jednym słowem by nie powielać kodu musimy po prostu poinformować program ,że w danym przypadku musi wykonać inną operację.

To byłoby tyle, jeśli chodzi o wstęp. Teraz pokażę jak można osiągnąć to w kodzie w C#.