Instytut Informatyki, Politechnika Poznańska, SUM-TWO Zaawansowane programowanie obiektowe 9 października 2016
dr inż. Bartłomiej Prędki pok. 124 Centrum Wykładowe tel. 61-665-2932 Bartlomiej.Predki@cs.put.poznan.pl http://zajecia.predki.com
Literatura 1. Język C# 2008 i platforma.net 3.5, A. Troelsen, PWN, Warszawa. 2009 2. Visual C#.NET. Encyklopedia, Microsoft, Helion, Warszawa, 2003 3. Visual Studio. NET, Robert B. Dunaway, Mikom, Warszawa, 2003 4. C# i.net, Stephen C. Perry, Helion, Warszawa, 2006 5. Inżynieria oprogramowania, A. Jaszkiewicz, Helion, Warszawa 6.
Historia programowania Język maszynowy Taśmy/karty dziurkowane W celu zwiększenia czytelności kody funkcji zastąpiono nazwami (mnemonikami) assembler Języki nastawione na obliczenia, np. Fortran Inne języki specjalizowane
Obliczanie ciągu Fibbonaciego w asemblerze x86 stosik segment stack rozmiar equ 100 dw rozmiar dup(?) stosik ends fibmul segment assume cs:fibmul,ds:fibmul,ss:stosik fib proc mov dx,bx push ax push bx push cx push di mov ax,1 mov bx,1 mov di,0 @while: cmp di,dx jge @endwhile mov cx,ax add cx,bx mov ax,bx mov bx,cx inc di jmp @while @endwhile: mov dx,bx pop di pop cx pop bx pop ax ret fib endp @start: mov ax,1 mov bx,1 @whille: cmp bx,cx jge @end call fib mul dx inc bx jmp @whille @end: int 3 fibmul ends end @start
Języki proceduralne Typy podstawowe (int, double, char) Tablice Typy wyliczeniowe Struktury (rekordy) Procedury Funkcje Przykłady Pascal, C
Inne języki Sztuczna inteligencja rachunek predykatów Prolog Przetwarzanie list LISP Język dla dzieci LOGO
Języki obiektowe Nowe podejście do programowania Bardzo ważne pojęcie klasy Pierwszy język obiektowy Smalltalk Rozszerzenie języków proceduralnych C++, Object Pascal, Objective-C Języki w pełni obiektowe Java, języki.net
Języki obiektowe Klasa składa się z: Zmiennych innych typów (Atrybuty, Pola) Funkcji działających na tych zmiennych (Operacje, Metody) Własności dostęp do pól za pomocą specjalizowanych metod. Obiekt instancja klasy.
Platforma.Net
Platforma.Net W 2001 roku Microsoft zaprezentował platformę.net Odpowiedź Microsoft u na sukces Javy Wady i zalety w stosunku do Javy
Cechy platformy.net przeznaczone do tworzenia i dystrybucji nowoczesnego, zorientowanego obiektowo oprogramowania, aplikacja.net może być napisana w jednym z wielu języków przeznaczonych dla platformy, udostępnia bibliotekę niezależnych językowo klas, umożliwia tworzenie samoopisujących się komponentów umożliwia integrację wielu języków programowania nowy model tworzenia aplikacji dla środowiska Windows nowy model tworzenia aplikacji webowych tworzenie aplikacji mobilnych nowa architektura dostępu do baz danych
Cechy platformy.net umożliwia tworzenia wieloplatformowych usług webowych udostępnia nową architekturę do tworzenia zdalnych obiektów wiele technik programowania dla Windows czyni przestarzałymi koniec piekła-dll
Języki.Net Języki wspierane przez Microsoft: C# (C sharp) Visual Basic.Net C++ J# (J sharp) Inne języki: COBOL EIFFEL PERL Python Smalltalk
Architektura.Net C# VB.Net MC++ Inne Wspólna specyfikacja języka CLS (CLI) Web Services Web Forms Windows Forms Windows Presentation Foundation Dostęp do danych i obsługa XML Bazowa biblioteka klas BCL Środowisko uruchomieniowe CLR
Język pośredni Kod źródłowy jest tłumaczony przez kompilator języka na kod pośredni IL (Intermediate Language). Kod IL jest wykonywany przez środowisko uruchomieniowe CLR (Common Language Runtime). Języki można mieszać dzięki wspólnemu systemowi typów CTS (Common Type System). Kod IL jest zawsze kompilowany, czyli nie korzysta z maszyny wirtualnej.
Kod C# Kod VB.Net Kod inny Kompilator C# Kompilator VB.Net Kompilator innego języka IL + metadata IL + metadata IL + metadata Kompilator JIT CLR Kod binarny
CLR kod jest kodem zarządzanym (managed code) istnieje możliwość współpracy z kodem tradycyjnym, np. z komponentami typu COM metadane zawierają automatycznie generowany opis komponentu, jego typów i interfejsu
CLR CLR zarządza aplikacjami ładuje i weryfikuje kod wykonuje garbage collection, separuje aplikacje zarządza bezpieczeństwem udostępnia możliwość debugowania i profilowania
CLR IL + metadane CLR Class loader JIT Weryfikacja Econo-JIT, Opti-JIT Zarządzany kod binarny, Garbage collection, bezpieczeństwo, wyjątki, wątki,...
Kompilator JIT Kompiluje kod IL do kodu maszynowego Pre-JIT kompiluje cały kod z góry, można używać w trakcie instalacji, Normal-JIT normalny kompilator, przechowuje skompilowany kod w cache u Econo-JIT kompilator optymalizujący kod dla limitowanych zasobów
Garbage collection uruchamia się, gdy zaczyna brakować pamięci, zakłada, że wszystko można usunąć, po czym dokonuje weryfikacji, elementy używane przesuwa na początek obszaru i uaktualnia wskaźnik wolnej pamięci, nie przenosi elementów o rozmiarze większym niż 20 kb, można uruchomić ten proces ręcznie.
Cykl kodu Kod źródłowy aplikacji Kompilator generuje kod IL i tworzy pakiet (assembly) Loader wczytuje nagłówek pliku wykonywalnego Ładowane są wymagane biblioteki DLL Wykonywana jest funkcja _CorExeMain z początku aplikacji _CorExeMain uruchamia JIT kompilujący kod IL na maszynowy Kod maszynowy jest wykonywany
Hello world
Hello World IL
Samoopisujący się kod
Samoopisujący się kod Informacje o kodzie zapisane są w manifeście (manifest), który zawiera opis typów, metod oraz np. wersję komponentu.
Narzędzia.Net Platform SDK, Visual Studio.Net (C#,VB,C++,J#) Borland C# Builder Delphi SharpDevelop (C#, VB) www.icscharpcode.net inne
Wieloplatformowość.Net Compact Framework na Pocket PC podzbiór platformy dla urządzeń mobilnych Project Mono dla Linux a CLR, JIT, klasy i kompilator C#. http://www.go-mono.com/ Portable.Net narzędzia i platforma dla wielu systemów http://www.southern-storm.com.au/
C#
C# i.net Framework Język C# jest podstawowym językiem programowania dla platformy.net Nie istnieje kompilator kompilujący kod C# na język maszynowy.
Microsoft C#.net Nowy język bazujący na C++ i Javie W pełni obiektowy nastawiony na programowanie dla platformy.net Podstawowe założenie wszystko jest klasą, nawet typy podstawowe Zarządzanie pamięcią wykonywane przez platformę uruchomieniową (Garbaga Collection)
Typy podstawowe byte sbyte short ushort int uint long ulong float double decimal string char bool
Deklarowanie zmiennych Zmienne są deklarowane jak w C, C++ int i; double liczba; string lancuch = Tekst ; W C# nie ma wskaźników!
Operatory Operatory identyczne jak w C++ podstawienie = porównanie == inkrementacyjne ++ -- += -= *= /= logiczne && znaki specjalne po \
Instrukcje warunkowe Zapis identyczny jak w C++ if (x==5) { } else { } switch (lancuch) { } case a : break; case b : break; default: break;
Pętle Pętle jak w C++ for (int i=0;i<5;i++) { ; } while (i<5) { ; }
Typ wyliczeniowy enum TypWyliczeniowy { wartosc1, wartosc2, wartosc3 } TypWyliczeniowy zmienna=wartosc2;
Obsługa wyjątków try { //kod, w którym może wystąpić błąd } catch (Exception e) { //został zgłoszony wyjątek - e } finally { //kończy obsługę wyjątku }
Zgłaszanie wyjątków if (y==0) throw new Exception( Nie możesz dzielić przez 0 ); return x/y;
Przestrzenie nazw Aby unikać konfliktów nazw stosuje się przestrzenie nazw (namespace). namespace program { ; }
Klasy W przeciwieństwie do C++ nie ma osobnej deklaracji i definicji elementów klasy. public class Complex { int re; int im; Complex() { re=0; im=0; } }
Rodzaje dostępu Identyfikator dostępu umieszcza się przed każdym elementem. private public protected internal wewnątrz pakietu (assembly) protected internal wewnątrz pakietu i dziedziczone
Dostęp do pól przez własności Ze względu na ochronę pól, zamiast metod typu Get/ Set stosuje się własności (Properties).
Konstruktory Klasa może mieć wiele konstruktorów, pod warunkiem, że różnią się argumentami Konstruktor ma nazwę taką jak klasa i nie ma typu. Konstruktor powinien być publiczny. Praktycznie nie używa się destruktorów.
Metody Może być wiele metod o tej samej nazwie, z zastrzeżeniem jak przy konstruktorach. Metody mogą mieć typ lub mogą być typu void. Można wymusić przekazywanie argumentów przez referencję korzystając ze słowa kluczowego ref.
Dziedziczenie Podstawową relację między klasami jest dziedziczenie. W C# nie ma wielokrotnego dziedziczenia jak w C++. public class Dziecko:Rodzic { ; }
Dziedziczenie Wielokrotne dziedziczenie można zastąpić przy pomocy interfejsów. Interfejs może definiować metody i właściwości
Polimorfizm Wszystkie klasy w C# dziedziczą po klasie object. Pod zmienną typu object można podstawić dowolny obiekt. Klasa object ma kilka metod, np. ToString. int i=5; object o=i; int j=(int)o;
Klasy abstrakcyjne Klasa jest abstrakcyjne, gdy jeden z jej elementów jest abstrakcyjny. Słowo kluczowe abstract.
Przeciążanie metod Aby można tworzyć obiekty klasy dziedziczącej po klasie abstrakcyjnej należy przeciążyć jej metody abstrakcyjne. Można przeciążać inne metody Słowo kluczowe override i sealed.
Przeciążanie metod
Metody wirtualne Przy stosowaniu klasycznych metod kompilator może w momencie kompilacji określić kiedy będzie wywołana jaka metoda Metoda wirtualna to metoda z późnym wiązaniem, na etapie wykonywania kodu.
Metody wirtualne A.F B.F B.G B.G
Metody klasy object Equals() porównuje dwa obiekty, ReferenceEquals() porównuje referencje do obiektów, GetHashCode() określa unikalny kod obiektu, GetType() określa typ obiektu, ToString() konwertuje obiekt na łańcuch znaków
Tablice i kolekcje Tablice są typami złożonymi. Kolekcje (ArrayList) rodzaj listy. Można się po nich poruszać korzystając z instrukcji foreach.
Tablice i kolekcje
Typy generyczne Podobne do szablonów w C++.Net 1.1.Net 2.0
Typy generyczne Można definiować kilka typów, np.: Metody typu generic
Typy generyczne Wbudowane w BCL, takie jak: List<> Dictionary<> Stack<>...
Iteratory Ułatwiają tworzenie własnych typów, które mogą być wywoływane za pomocą instrukcji foreach
Iteratory Klasa może mieć wiele iteratorów
Typy częściowe Umożliwiają zapis kodu klasy w oddzielnych częściach, np. plikach. Wszystkie części muszą być obecne w momencie kompilacji.
Typy null owe Umożliwiają podstawianie wartości null do zmiennych typów podstawowych, np. int. Kwestie konwersji typów.
.Net Framework 3.0 CLR zgodny z 2.0 Nowe elementy: Windows Presentation Foundation, Windows Communication Foundation, Windows Workflow Foundation, Windows CardSpace.
.Net Framework 3.5 Nowe elementy językowe: typy implicite - określane przez wartość
.Net Framework 3.5 Metody rozszerzające (Extension methods)
.Net Framework 3.5 Metody lambda - rozszerzenie metod anonimowych operator lambda => (goes to)
.Net Framework 4.0 Typy dynamiczne - wiązanie w czasie uruchomienia Argumenty opcjonalne Argumenty z nazwą Lepszy mechanizm InterOp
Przeciążanie konstruktorów Konstruktory muszą się różnić argumentami!
Przeciążanie operatorów
Operatory konwersji implicit konwersja domyślna explicit - wymuszona
Operatory is i as is sprawdza czy dany obiekt można bezpiecznie rzutować na określony interfejs as dokonuje od razu rzutowania na interfejs
Interfejsy Interfejsy mogą mieć nie tylko metody ale i własności W ramach platformy.net jest zdefiniowanych kilka interfejsów, np. IComparable ma metodę CompareTo i pozwala na sortowanie obiektów w kolekcjach
Interfejsy
Interfejs IEquatable<> umożliwia porównywanie obiektów za pomocą standardowych mechanizmów, np. metody Contains, IndexOf kolekcji
Delegacje Zastępują wskaźniki do funkcji w C++, przy czym są bezpieczne (kontrola typów) Określają jakiego typu i z jakimi argumentami będzie wywołana funkcja
Delegacje
Delegacje
Delegacje