Zaawansowane Systemy
Programowania Grafiki
Wykład 2
Platforma .NET
Platforma programistyczna
środowisko uruchomieniowe: Common Language
Runtime (CLR)
biblioteka klas: Base Class Library (BCL)
operacje na plikach, wyświetlanie grafiki, interakcja z
bazami danych, manipulacja XML, kryptografia, algorytmy
numeryczne, komunikacja sieciowa
Niezwiązana z konkretnym językiem
programowania
Automatyczne zarządzanie
kodem programu
pamięcią
zabezpieczeniami i wyjątkami
Najnowsza wersja: .NET Framework 4
Common Language Runtime
środowisko uruchomieniowe platformy .NET
„maszyna wirtualna aplikacji”
kompiluje i wykonuje kod zapisany w języku
pośrednim (Common Intermediate Language)
wbudowane mechanizmy
zarządzania pamięcią i wątkami
obsługi wyjątków
zwalniania pamięci, tzw. „garbage collection”
kontroli bezpieczeństwa wykonywanych aplikacji
niezależna od maszyny i systemu operacyjnego
(w przeciwieństwie do Win32 API)
Windows, Unix, Macintosh
CLR
Kompilacja
Uruchomieni
e
Just-In-Time
Kompilacja w locie, bezpośrednio przed wykonaniem
danego fragmentu kodu
kod źródłowy → kod bajtowy (pośredni)
program jest rozpowszechniany w postaci kodu pośredniego
na maszynie uruchamiającej program:
kod bajtowy → kod maszynowy
Zalety
tradycyjna maszyna wirtualna interpretuje kod bajtowy, JIT
jest wydajniejszy
kompilacja może być zoptymalizowana pod system
docelowy
system może zbierać statystyki n.t. szybkości działania i
dodatkowo optymalizować kod
jeżeli jest taka potrzeba, to można skompilować kod
źródłowy do kodu maszynowego
Common Language Infrastructure
Otwarta specyfikacja obejmująca:
Common Type System
Metadane (informacja o strukturze programu)
Common Language Specification
Virtual Execution System (VES)
Każdy język, który spełni standard ECMA-335
może generować kod rozumiany przez CLR
VB.NET, C#, J#, C++/CLI, JScript, Perl, Python,
Fortran, Cobol, #Smalltalk, Delphi.NET,
DotLisp, Ruby.NET
CLR jest implementacją standardu CLI
autorstwa Microsoft
Virtual Execution System
Uruchamia (JIT), linkuje i ładuje pliki napisane
dla CLI
Udostępnia usługi takie jak:
Garbage collection
Code Access Secuirity
co mój kod może robić
kto może wołać mój kod
Wsparcie dla debugowania
Współpraca kodu zarządzanego i nie zarządzanego
Język C# w 30 minut
Język
obiektowy
wywodzący się z C++ i Javy
brak bezpośredniego dostępu do pamięci
(safe/unsafe code)
automatyczne zarządzanie pamięcią, garbage
collection
brak zmiennych i funkcji globalnych
zmienne lokalne nie mogą się przesłaniać
bool jest typem ścisłym
C# nie wspiera wielodziedziczności
wspiera mechanizm refleksji
Typy parametryzowane: Generics (polimorfizm
parametryczny)
Typy
Bezpośrednie: bool, char, sbyte, byte,
short, ushort, int, uint, long, ulong, float,
double, struct, enum, decimal
umieszczane na stosie
bezpośrednio zawierają dane
każda zmienna ma swoją kopię
Referencyjne: obiekty
umieszczane na stercie
zmienna zawiera referencję do danych
wiele zmiennych może odnosić się do jednego
obiektu – operacje na jednej zmiennej mogą mieć
wpływ na drugą
Enumeracja
class
Przyklad
{
enum
DniTygodnia
{ Poniedzialek, Wtorek, Sroda };
DniTygodnia
dzien;
Przyklad()
{
dzien =
DniTygodnia
.Poniedzialek;
}
}
Konwersja typów
C# wymaga zgodności typów
konieczność jawnej konwersji jeżeli może zajść
utrata informacji
klasa Convert
int
x =
Convert
.ToInt32(123.456);
Object
o;
//...
// if (!o) - źle
if
(o==
null
)
// dobrze
{
//...
}
Tablice
jednowymiarowe
int[] tab = new int[10]; tab.Length;
int[] tab = {1, 2, 3, 4, 5};
wielowymiarowe
int[,] tab2d = new int[10,3];
tab.Length; tab.GetLength(1);
nieregularne
int[][] jagged = new int[10][];
jagged[0] = new int[5];
jagged[1] = new int[100];
Instrukcje warunkowe
if (wyrażenie) { instrukcje; } else
{ instrukcje; }
switch/case
switch
(ch)
{
case
'a'
:
break
;
case
'b'
:
break
;
default
:
break
;
}
Pętle
while (wyrażenie) { instrukcje; }
for (wyrażenie) { instrukcje; }
do {instrukcje;} while (wyrażenie)
foreach(typ zmienna in kolekcja) {instrukcje;}
Instrukcje skoku
goto
break
continue
Klasy
modyfikator static – typ/metoda statyczna
modyfikator partial class – klasa rozbita na
wiele plików
klasa może rozbita na wiele plików, np.:
public partial class MojaKlasa { .... }
Modyfikatory dostępu
public – typ lub pole dostępny dla innego
kodu w tym samym lub innym assembly
private – typ lub pole dostępne tylko dla kodu
w tej klasie (domyślne dla pól klasy)
protected – typ lub pole dostępne dla kodu w
tej klasie lub klasie potomnej
internal – typ lub pole dostępne dla kodu
tylko w tym assembly (domyślne dla klas)
protected internal = protected OR internal
Dziedziczenie
Można dziedziczyć tylko po jednej klasie ale
po wielu interfejsach
Funkcje wirtualne
modyfikatory
virtual – jawna deklaracja funkcji wirtualnej
override – jawna deklaracja przeciążenia funkcji
wirtualnej
Klasy i metody abstrakcyjne
modyfikator abstract
Właściwości (Properties)
Obsługa wyjątków
OutOfMemoryException
NullReferenceException
InvalidCastException
ArrayTypeMismatchException
IndexOutOfRangeException
ArithmeticException
DivideByZeroException
OverFlowException
Delegaty
modyfikator delegate
typ danych definiujący
referencję do funkcji
podobne do wskaźników do
funkcji w C/C++
multicast
użycie delegata:
deklaracja
utworzenie
wywołanie
Zdarzenia
Obserwowany
rozsyła zdarzenia do
obserwatorów:
Deklaracja delegata i zdarzenia
Deklaracja metody rozsyłającej
W odpowiednim momencie wywołanie metody
rozsyłającej
Obserwator
rejestruje się do obserwowanego:
Deklaracja metody reagującej na zdarzenie
powiązanie metody reagującej ze zdarzeniem
obserwowanego
using
System;
namespace
MojaPrzestrzen
{
public
class
Obserwowany
{
private
string
tekst;
// deklaracja delegata i zdarzenia
public
delegate
void
Handler
(
object
source,
string
tekst);
public
event
Handler
Zdarzenie;
protected
void
Rozeslij(
string
tekst)
{
if
(Zdarzenie !=
null
)
Zdarzenie(
this
, tekst);
}
public
string
Tekst
{
set
{
this
.tekst =
value
; Rozeslij(
value
); }
get
{
return
tekst; }
}
}
public
class
Obserwator
{
public
void
Reaguj(
object
source,
string
t)
{
System.
Console
.WriteLine(
"Nowy tekst: "
+t);
}
}
public
class
Test
{
public
static
void
Main()
{
Obserwowany
a =
new
Obserwowany
();
a.Tekst =
"Hej"
;
Obserwator
b =
new
Obserwator
();
a.Zdarzenie +=
new
Obserwowany
.
Handler
(b.Reaguj);
a.Tekst =
"123"
;
}
}
}
Przeciążanie operatorów
Preprocesor
#if
#else
#elif
#endif
#define
#undef
#warning
#error
#line
#region
#endregion
Dokumentacja XML
Dokumentacja w kodzie
<remarks>, <summary>, <example>, <exception>,
<param>, <permission>, <returns>, <seealso>,
<include>
Ikony