Transcript Elementy C

PLATFORMY
TECHNOLOGICZNE
ELEMENTY JĘZYKA C#
mgr inż. Tomasz Gawron
Czym jest C#
2






Stworzony specjalnie dla .NET
Zbliżony składniowo do C++ i Javy
Posiada IDE (Visual Studio)
Obiektowy, obsługuje zdarzenia (event-driven)
Może współpracować z komponentami stworzonymi
w innych językach
Język zarządzany (obsługiwany przez garbage
collector)
Platformy Technologiczne 2012
Struktura programu
3
// Namespace Declaration
using System;
namespace MyProgram {
// helper class
class OutputClass
{
string myString;
// Constructor
public OutputClass(string inputString)
{
myString = inputString;
}
// Instance Method
public void printString()
{
Console.WriteLine("{0}", myString);
}
}
// Program start class
class InteractiveWelcome
{
// Main begins program execution.
public static void Main(string[] args)
{
// Write to console/get input
Console.Write("What is your name?: ");
Console.Write("Hello, {0}! ",
Console.ReadLine());
Console.WriteLine("Welcome to the C#
Tutorial!");
// Instance of OutputClass
OutputClass outCl = new
OutputClass("This is printed by the output
class.");
// Call Output class' method
outCl.printString()
}
}
Platformy Technologiczne 2012
Typy zmiennych
4
Typ
Zawartość
Typ wartościwy
Wartość zdefiniowanego typu
Typ wartościowy „nullable”
Wartość zdefiniowanego typu lub null
Obiekt
Null, referencja do obiektu dowolnego typu, referencja do boxowanej wartości dowolnego typu
Klasa
Null, referencja do instancji klasy, referencja do instancji klasy dziedziczącej
Interfejs
Null, referencja do instancji klasy implementującej interfejs, referencja do boxowanej wartości typu
implementującego interfejs
Tablica
Null, referencja do instancji tablicy danego lub kompatybilnego typu
Delegat
Null, referencja do instancji typu delegata
Platformy Technologiczne 2012
Typy wartościowe
5

Typy całkowite
(8 bit)
 (16 bit)
 (32 bit)
 (64 bit)


byte
short
int
long
(0, 28-1),
(-215, 215-1),
(-231, 231-1),
(-263, 263-1),
sbyte (-27, 27-1)
ushort
uint
ulong
Typy zmiennoprzecinkowe
(32 bit) float (±1,5*10-45 ,±3,4*1038)
 (64 bit) double (±5,0*10-324 ,±1,7*10308)


Typy binarne

bool
Platformy Technologiczne 2012
float x = 0.5f;
double x = 0.5;
Typy wartościowe „nullowalne”
6

Oprócz standardowych wartości mogą przyjmować również null

Definicja ze znakiem zapytania:
int? i = null;

Dodatkowe właściwości:



HasValue (wartość binarna sprawdzająca czy zmienna nie jest null)
Value
Operator „??”

Gdy pierwsza wartość jest null, przekaż wartość drugą
int x = a ?? b;
Platformy Technologiczne 2012
Boxing i unboxing
7


Wykorzystywane przy przejściach pomiędzy typami
wartościowymi a referencyjnymi
Boxing:


Unboxing:


Alokacja „pudełka” na stercie, skopiowanie wartości do
„pudełka”
Sprawdzenie typu „pudełka”, skopiowanie wartości z
„pudełka” na stos
Korzyści:
Nie są potrzebne klasy – wrappery
 Kolekcje są uniwersalne – współpracują z każdym typem

Platformy Technologiczne 2012
Boxing i unboxing
8
i
123
int i = 123;
object o = i;
int j = (int)o;
o
System.Int32
123
j
123
Platformy Technologiczne 2012
Co się stanie?
9
F a = new F(5); //konstruktor przypisuje przekazaną wartość zmiennej a
F b = a;
b.X= 10;
Console.WriteLine(a.X); //wynik?
int a = 1;
int b = a;
b = 2;
Console.WriteLine(a); //wynik?
Platformy Technologiczne 2012
Klasy
10



Dziedziczenie po jednej klasie
Implementacja wielu interfejsów
Modyfikatory dostępu:





Public
Private
Protected
Internal
Elementy klasy:



Stałe, pola, metody, właściwości, indeksery, zdarzenia, operatory,
konstruktory, destruktory
Elementy statyczne / instancji
Typy zagnieżdżone
Platformy Technologiczne 2012
Konstruktory klas
11




Konstruktor jest metodą wywoływaną podczas tworzenia
nowej instancji klasy
Posiada taką samą nazwę jak klasa
Nie zwraca żadnych wartości
Może być przeciążony
class NazwaKlasy{
public NazwaKlasy(){
//konstruktor bezargumentowy
...
}
public NazwaKlasy(int arg1,double arg2){
//konstruktor z argumentami
...
}
}
Platformy Technologiczne 2012
Klasy wieloplikowe
12


W C# definicję klasy można podzielić pomiędzy
wiele plików (np. WinForms)
Wszystkie pliki muszą być dostępne w czasie
kompilacji
//Plik1.cs
partial class Klasa1
{ //częściowa definicja klasy }
//Plik2.cs
partial class Klasa1
{ //częściowa definicja klasy }
Platformy Technologiczne 2012
Struktury
13






Struktury są zawsze wartościami
Mogą zawierać pola, interfejsy, funkcje składowe i
konstruktory z argumentami
Przypisanie kopiuje dane nie referencję
Brak dziedziczenia
Struktury są wydajniejsze przy lekkich obiektach
(np. punkt) – nie wymagana obsługa przez GC
Wydajniejsze zużycie pamięci
Platformy Technologiczne 2012
Interfejsy
14
Zbiór funkcji pod wspólną nazwą
 Same deklaracje - brak implementacji
 Wszystkie składowe publiczne



Wielokrotne dziedziczenie
Elementy:
 metody,
właściwości, indeksery, Zdarzenia
Platformy Technologiczne 2012
Interfejsy
15
Klasę implementującą jeden lub wiele interfejsów można traktować jako klasę
należącą do wielu typów. Może być postrzegana jak instancja typu każdego z
implementowanych interfejsów

Możliwość traktowania odmiennych klas w podobny sposób, jeśli implementują ten
sam interfejs

interface INazwa{
void f();
String Wlasciwosc{
get;
set;
}
event EventHandler
//int i; - błąd
zdarzenie;
class Klasa : INazwa {
String s;
public virtual void f(){...}
public virtual String Wlasciwosc {
get {return s;}
set {s = value;}
}
public virtual event
EventHandler zdarzenie;
}
//Słowo virtual jest opcjonalne
}
Platformy Technologiczne 2012
Implementacja interfejsu
16

Jawna
interface Interfejs1 {
void f();
}
interface Interfejs2 {
void f();
}
class Klasa : Interfejs1, Interfejs2 {
public void f() { Console.WriteLine("Implementacja w sposób niejawny"); }
}

Niejawna
interface Interfejs1 {
void f();
}
interface Interfejs2 {
void f();
}
class Klasa : Interfejs1, Interfejs2 {
void Interfejs2.f() {
Console.WriteLine("Implementacja w sposób jawny");
}
}
Platformy Technologiczne 2012
Enum
17

Silnie typowane typy wyliczeniowe





Brak jawnej konwersji na int
Zawierające zbiór nazwanych stałych
Nie mogą być deklarowane wewnątrz metody
Można jawnie zadeklarować typ
Kod staje się czytelniejszy
enum Color: byte
{
Red
= 1,
Green = 2,
Blue = 4,
Black = 0,
White = Red | Green | Blue,
}
Platformy Technologiczne 2012
Kompilacja warunkowa
18


#define, #undef
#if, #elif, #else, #endif
 Logika

bool - owska
Można implementować metody warunkowe
 Wykonanie
zależne od trybu wywołania programu
Platformy Technologiczne 2012
Tablice
19

Deklaracja:
int[] tab = new int[4];
float[, ,] tab2 = new float[3, 3, 3];

Cechy tablic:
 Jednorodność
 Swobodny
dostęp
 Stała liczba elementów
 Ciągłość pamięciowa
Platformy Technologiczne 2012
Kolekcje
20

System.Collections oraz System.Collections.Generic
Nazwa
Porządek
Bezpośredni dostęp
Opis / Zastosowanie
Dictionary
Brak
Klucz
Kolekcja typu klucz – wartość. Klucze muszą być unikalne. Umożliwia bardzo
szybkie wyszukiwanie i wstawianie elementów – O(1)
SortedDictionary
Posortowany
Klucz
Posortowana kolekcja Dictionary oparta na drzewach binarnych.
List
Brak
Indeks
Korzystna przy małych kolekcjach bez konieczniści sortowania.
LinkedList
Brak
Indeks
Korzystna przy strukturze często wstawiajacej wartości w środkowe
elementy
SortedList
Posortowany
Indeks
Posortowana lista – drzewo binarne przechowywane w tablicy umożliwia
szybsze wyszukiwanie
HashSet
Brak
Klucz
Kolekcja klucz – wartość z identycznym typem klucza i wartości
SortedSet
Posortowany
Klucz
Posortowany HashSet
Stack
LIFO
Tylko góra
Lista przetwarzana w strategii dostępu LIFO
Queue
FIFO
Tylko początek
Lista przetwarzana w strategii dostępu FIFO
Platformy Technologiczne 2012
Porównywanie obiektów
21

IComparable (interfejs dla typów posiadających porządek)
public interface IComparable {
int CompareTo(object obj); // <0 if this < obj, 0 if this == obj, >0 if this > obj
}
public interface IComparable<T> {
int CompareTo(T obj); // <0 if this < obj, 0 if this == obj, >0 if this > obj
}

IComparer (interfejs realizujący porównanie obiektów)
public interface IComparer {
int Compare(object x, object y); // <0 if x < y, 0 if x == y, >0 if x > y
}
public interface IComparer<T> {
int Compare(T x, T y); // <0 if x < y, 0 if x == y, >0 if x > y
}
Platformy Technologiczne 2012
Pętle
22

For

int number = 5;
for(int i = 0; i < number; i++)
{ Console.WriteLine(i); }

Foreach

int number = 0;
while(number < 5)
{number = number + 1;}

Kolekcja musi implementować interfejs
IEnumerable
ArrayList list = new ArrayList();
list.Add(„Jan Kowalski");
list.Add(„Adam Nowak");
foreach(string name in list)
{ Console.WriteLine(name); }
While
Do… while
int number = 0;
do
{ number = number + 1; }
while(number < 5);
Platformy Technologiczne 2012
Atrybuty
23

Służą dołączaniu metadanych do kodu
public class OrderProcessor
{
[WebMethod]
public void SubmitOrder(PurchaseOrder order) {...}
}
[XmlRoot("Order", Namespace="urn:acme.b2b-schema.v1")]
public class PurchaseOrder
{
[XmlElement("shipTo")] public Address ShipTo;
[XmlElement("billTo")] public Address BillTo;
[XmlElement("comment")] public string Comment;
[XmlElement("items")]
public Item[] Items;
[XmlAttribute("date")] public DateTime OrderDate;
}
Platformy Technologiczne 2012
Atrybuty
24



Mogą być dołączane do klas, typów oraz metod
Dostęp uzyskujemy za pomocą refleksji
W pełni „konfigurowalne”



Klasy dziedziczące po System.Attribute
Bezpieczne (typ sprawdzany jest podczas
kompilacji)
Przykłady użycia:
 Web
Services, XML, serializacja, konfiguracja kodu
Platformy Technologiczne 2012
Delegaty
25





Zorientowane obiektowo wskaźniki na metody
Zastępuje wskaźniki do funkcji
Sygnatura i typ wartości zwracanej delegacji musi
być identyczny jak funkcji którą reprezentuje
Pozwala wywołać dowolną metodę z dowolnego
obiektu
Dwa typy:
 System.Delegate
 System.MulticastDelegate
Platformy Technologiczne 2012
Definiowanie i używanie delegatów
26
Deklaracja delegatu
delegate void Notifier (string sender);
// ordinary method signature
// with the keyword delegate
Deklaracja zmiennej delegatu
Notifier greetings;
Przypisanie metody
void SayHello(string sender) {
Console.WriteLine("Hello from " + sender);
}
greetings = new Notifier(SayHello);
// or just:
greetings = SayHello;
Wywołanie delegacji
greetings("John");
// invokes SayHello("John") => "Hello from John"
Platformy Technologiczne 2012
System.MulticastDelegate
27

Delegat zawierający referencję do kilku metod
Notifier greetings;
greetings = SayHello;
greetings += SayGoodBye;
greetings("John");
// "Hello from John"
// "Good bye from John"
greetings -= SayHello;
greetings("John");
// "Good bye from John"
Platformy Technologiczne 2012
Metody anonimowe
28

Metoda jest tworzona dynamicznie


Ma wszystkie funkcjonalności metod „jawnych”
Przykład:

„f” jest delegatem
int a = 12;
f += delegate(int b) {return a * b; }
Platformy Technologiczne 2012
Zdarzenia
29


Zdarzenia (event) w C# są specjalnym typem
delegatów
Dwóch uczestników:
 Źródło
zdarzeń - ten który publikuje
 Odbiorca – subskrybent (może być wielu
subskrybentów)

Deklarowane wewnątrz klas
Platformy Technologiczne 2012
Zdarzenia - źródło
30

Zdefiniowanie delegatu
public delegate void EventHandler(object sender, EventArgs e);

Zdefiniowanie logiki
public class Button {
public event EventHandler Click;
protected void OnClick(EventArgs e) {
// This is called when button is clicked
if (Click != null) Click(this, e);
}
}
Platformy Technologiczne 2012
Zdarzenia - subskrybent
31

Definicja i zarejestrowanie obsługi
public class MyForm : Form {
Button okButton;
static void OkClicked(object sender, EventArgs e) {
ShowMessage("You pressed the OK button");
}
public MyForm() {
okButton = new Button(...);
okButton.Caption = "OK";
okButton.Click += new EventHandler(OkClicked);
}
}
Platformy Technologiczne 2012
Przesyłanie argumentów do metod
32

Wartość
static void Nazwa(int x){...}
int a = 5;
Nazwa(a);

Referencja
static void Nazwa(ref int x){...}
int a = 5;
Nazwa(ref a);

Parametr wyjściowy
static void Nazwa(out int x){...}
int a;
Nazwa(out a);
Platformy Technologiczne 2012
Właściwości
33

Definicja wirtualnego atrybutu

Dostęp definiowany przez „get” oraz „set”
[modyfikator dostępu] typ Nazwa
{
get{...}
set{...}
}

Korzyści:




Pojęcie reprezentuje pewien atrybut klasy, ale w celu jego implementacji trzeba
wywołać pewne funkcje
Jedną wartość można w prosty sposób obliczyć na podstawie drugiej
Dostęp do pola klasy musi być kontrolowany w celu zapewnienia spójności
(poprawności) obiektu
Ukrycie implementacji (typu)
Platformy Technologiczne 2012
Automatyczne właściwości
34


Wprowadzone w C# 3.0
Uproszczenie kodowania
//C# 2.0
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
//C# 3.0
public int MyAge { get; set; }
Platformy Technologiczne 2012
Indekser
35

Oferuje sposób dostępu do kolekcji wartości utrzymywanych w
ramach pojedynczego obiektu klasy – parametry jak indeks kolekcji
public class SkyScraper {
Story[] stories;
public Story this [int index] {
get { return stories[index]; }
set { if (value!=null) {
stories[index] = value;
}
}
}
SkyScraper searsTower = new SkyScraper();
searsTower[155] = new Story(“Observation Deck”);
searsTower[0] = new Story(“Entrance”);
Platformy Technologiczne 2012
Inicjalizatory
36

Pozwalają na uproszczone przypisywanie wartości
do publicznych pól klasy
public class Human
{
public int Age { get; set; }
public int Height { get; set; }
}
Human h1 = new Human();
h1.Age = 24;
h1.Height = 175;
Human h2 = new Human() { Age = 18, Height = 168 };

Można z nich korzystać przy inicjalizacji struktur
Platformy Technologiczne 2012
Zmienne niejawnie typowane
37

Zmienna typu „var”
var f = 3.0f;


Kompilator zawsze generuje silnie typowaną
referencję na podstawie aktualnej wartości
Ograniczenia:
 Wartość
musi być zainicjalizowana przy deklaracji
 Nie może być zainicjalizowana jako null
 Typ musi być dostępnu dla kompilatora
 Nie mogą być polami klas
Platformy Technologiczne 2012
Typy anonimowe
38

Tworzone dynamicznie przy użyciu zmiennych niejawnych
var v = new { Price = 200, Quantity = 5 };



Dobra metoda enkapsulacji właściwości tylko do odczytu
Typy są generowane dynamicznie na poziomie kompilatora
Wykorzystanie w LINQ
Platformy Technologiczne 2012
Wyrażenia lambda
39

Składnia:
 (parametry
wejściowe) => (operacje)
IEnumerable<string> allJohns = allNames.Where(x => x.Equals("John"));
Platformy Technologiczne 2012
Metody rozszerzające
40

Umożliwiają rozszerzanie istniejących klas o nowe
metody
 Metoda
musi być zdefiniowana jako statyczna
public static class Extensions
{
public static int Increment(this int i)
{
return ++i;
}
}
//wywołanie
int i = 0;
int j = i.Increment();
Platformy Technologiczne 2012
Wyjątki
41




Wyjątek jest sytuacją, która nie może być rozwiązana
w danym kontekście aplikacji (dzielenie przez 0, błąd
połączenia z bazą danych)
Zgłoszenie wyjątku oznacza, że wystąpiła błędna
sytuacja, której aplikacja nie potrafi sama rozwiązać
Wyjątek powinien być przechwycony w kodzie oraz
odpowiednio obsłużony poprzez przekazanie
sterowania do właściwego bloku
Standardowym procesem obsługi wyjątków jest
zgłoszenie i zalogowanie błędu oraz zakończenie
błędnego procesu
Platformy Technologiczne 2012
Wyjątki
42

Wyjątki mogą pojawiać się na różnych poziomach abstrakcji
 Sprzętu / systemu operacyjnego
 Dzielenie przez 0
 Stack overflow
 Języka
 Niepoprawna konwersja
 Null pointer exception
 Błędy rzutowania
 Programu
 Wyjątki zdefiniowane przez użytkownika
Platformy Technologiczne 2012
Typy wyjątków
43
Typ
Opis
Exception
Najbardziej ogólna klasa, może reprezentować wszystkie wyjątki, dziedziczą po
niej wszystkie klasy wyjątków. Dzieli się na 2 podgrupy (ApplicationException,
SystemException )
ApplicationException
Wyjątki specyficzne dla danej aplikacji
SystemException
Klasa ogólna dla predefiniowanych wyjątków
ArithmeticException
Zgłaszany w razie wystąpienia błędu podczas operacji arytmetycznych lub
konwersji
FormatException
Zgłaszany np. przez metody klasy Convert, gdy podany napis nie reprezentuje
wartości, do której chcemy go przekonwertować
NullReferenceException
Zgłaszany, kiedy używana jest zmienna referencyjna, która ma wartość null
OutOfMemoryException
Zgłaszany, kiedy występuje niewystarczająca ilość pamięci
IndexOutOfRangeException
Zgłaszany, gdy następuje odwołanie do nieistniejącego elementu tablicy
ArgumentException
Zgłaszany w przypadku, kiedy jeden z argumentów dostarczanych do metody
jest nieprawidłowy
Platformy Technologiczne 2012
Obsługa wyjątków
44
using System;
class ExceptionTestClass
{
public static void Main()
{
int x = 0;
try
{
int y = 100/x;
}
catch (ArithmeticException e)
{
Console.WriteLine("ArithmeticException Handler: {0}", e.ToString());
}
catch (Exception e)
{
Console.WriteLine("Generic Exception Handler: {0}", e.ToString());
}
finally
{ //some finalization logic }
}
}
Platformy Technologiczne 2012
System.IO - Strumienie
45
TextReader
StreamReader
TextWriter
BinaryReader
BinaryWriter
Stream
StreamWriter
…
FileStream
StringReader
MemoryStream
NetworkStream
Platformy Technologiczne 2012
StringWriter
System.IO.Stream
46
public abstract class Stream : MarshalByRefObject, IDisposable {
public abstract bool CanRead { get; }
• Bazowe właściwości strumienia
public abstract bool CanSeek { get; }
public abstract bool CanWrite { get; }
public abstract int Read(out byte[] buff, int offset, int count);
public abstract void Write(byte[] buff, int offset, int count);
public virtual int ReadByte();
public virtual void WriteByte(byte value);
public virtual IAsyncResult BeginRead(…);
public virtual IAsyncResult BeginWrite(…);
public virtual int EndRead(…);
public virtual int EndWrite(…);
public abstract long Length { get; }
public abstract long Position { get; set; }
public abstract long Seek(long offset, SeekOrigin origin);
public abstract void Flush();
public virtual void Close();
...
}
• Synchroniczny odczyt i zapis
• Asynchroniczny odczyt i zapis
• Długość i aktualna pozycja
• Pozycjonowanie
• Wysłanie danych i zamknięcie
strumienia
Platformy Technologiczne 2012
Operacje na strukturze plików
47


Wszystkie klasy znajdują się w System.IO
Directory, DirectoryInfo


File, FileInfo


Operacje na plikach
Path


Operacje na katalogach
Operacje na tekście zawierającym informacje o ścieżce
dostępu do pliku lub katalogu
FileSystemWatcher

Monitoring systemu plików
Platformy Technologiczne 2012
System.String
48

Obsługa znaków specjalnych w ciągach (zastosowanie „@”)
string rst1 = "Hi there!";
string vst1 = @"Hi there!";
string rst2 = "It started, \"Four score and seven...\"";
string vst2 = @"It started, ""Four score and seven...""";
string rst3 = "Value 1 \t 5, Val2 \t 10";
string vst3 = @"Value 1 \t 5, Val2 \t 10";
// Interprets tab esc sequence
// Does not interpret tab
string rst4 = "C:\\Program Files\\Microsoft\\";
string vst4 = @"C:\Program Files\Microsoft\";
string rst5 = " Print \x000A Multiple \u000A Lines";
string vst5 = @" Print
Multiple
Lines";
Platformy Technologiczne 2012
System.String
49

Służy do obsługi ciągów znaków

Porównywane wg wartości

Zmodyfikowane zapisywane są pod innym adresem
Metody
Opis
Compare()
porównanie dwóch łańcuchów
Concat()
utworzenie nowego łańcucha z jednego lub większej liczby
Copy()
utworzenie nowego łańcucha przez przekopiowanie zawartości
Chars[]
indekser łańcucha
Insert()
zwraca nowy łańcuch z dostawionym nowym łańcuchem
Remove()
usunięcie z łańcucha określonej liczby znaków
Split()
rozbicie łańcucha na podłańcuchy przy założonym zbiorze ograniczników
StartsWith()
wskazuje czy łańcuch rozpoczyna się od określonych znaków
Substring()
wyłuskanie podłańcucha
ToLower()
zwraca kopię łańcucha składającego się z małych liter
Trim()
wyrzucenie określonego zbioru znaków z początku i końca łańcucha
Platformy Technologiczne 2012
System.Text.StringBuilder
50

Zastosowanie do tworzenia i przetwarzania ciągów
znaków

Ciągi są przechowywane w buforze – operacje są szybsze i
zużywają mniej zasobów
using System.Text;
StringBuilder sb = new StringBuilder("Hi there.");
Console.WriteLine("{0}", sb); // Print string
sb.Replace("Hi", "Hello"); // Replace a substring
Console.WriteLine("{0}", sb); // Print changed string
Platformy Technologiczne 2012
Wątki
51

Zapewnienie równoległego wykonania
 Prawdziwe
zrównoleglanie tylko w instancjach
wieloprocesorowych

Wątki a procesy
 „tańsza”
komunikacja w ramach wątków jednego
procesu
 wspólna pula adresowa dla wątków
Platformy Technologiczne 2012
System.Threading.Thread
52

Instancję nowego wątku tworzymy za pomcą delegata ThreadStart
Alpha oAlpha = new Alpha();
Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));

Lista metod
Metoda
Działanie
Start
Startuje wątek
Abort
Kończy wątek, generuje wyjątek ThreadAbortException
Sleep
Blokuje wątek na przekazaną ilość milisekund
Join
Blokuje wątek tworzący do czasu zakończenia operacji/wątku
Priority
(Property)Pozwala na zdefiniowanie ważności wątku (ThreadPriority)
Finalize
Zwalnia wszystkie zasoby wykorzystywane przez wątek
Platformy Technologiczne 2012
Synchronizacja wątków
53


Sekcja krytyczna – fragment kodu, który może być
wykonywany przez jeden wątek
Tworzenie sekcji krytycznych
 Lock
 Monitory
 Przerwania
Platformy Technologiczne 2012
Lock
54



Blokuje wielowątkowe wykonanie kodu
Zapewnia sekwencyjny dostęp
Wykorzystywany przy dostępie do współdzielonej
pamięci
public int Increment(ref int x)
{
lock (this)
{
return ++x;
}
}
Platformy Technologiczne 2012
Pula wątków
55


Umożliwia zarządzanie grupą wątków
Wykorzystywana podczas tworzenia
wielowątkowych zadań wykonujących zbliżone
operacje
 Wielowątkowe
obliczanie ciągu Fibonacciego
Platformy Technologiczne 2012
Wskaźniki i kod niezarządzany
56



W C# możemy w szczególnych przypadkach
korzystać z kodu niezarządzanego (komunikacja z
systemem, elementy wymagające zwiększonej
wydajności, …)
Słowo kluczowe „unsafe”
Wymaga zmieny ustawienia kompilatora
Platformy Technologiczne 2012
P/Invoke
57

Platform Invoke pozwala na wywoływanie z
poziomu kodu .NET obiektów niezarządzanych
 biblioteki


dll, obiekty COM, dostęp do WIN32 API, …
Użycie atrubutu [DllImport]
Kroki:
 Zlokalizowanie
implementowanej biblioteki
 Załadowanie biblioteki do pamieci
 Znalezienie adresu funkcji i przesłanie argumentów na
stos
 Przekazanie kontroli do kodu niezarządzanego
Platformy Technologiczne 2012
P/Invoke
58
using System;
using System.Runtime.InteropServices;
class Class1
{
[DllImport("user32.dll", CharSet=CharSet.Auto)]
static extern int MessageBox(IntPtr hWnd, String text, String caption, int options);
[STAThread]
static void Main(string[] args)
{
MessageBox(IntPtr.Zero, "Text", "Caption", 0);
}
}
Platformy Technologiczne 2012
Refleksja
59




Umożliwia odnoszenie się do systemu typów
podczas wykonania programu
Tworzenie typów z przekazanych nazw (stringów)
Dynamiczne pobieranie właściwości klas oraz
wywoływanie metod
Namespace System.Reflection
Platformy Technologiczne 2012
Przetwarzanie XML
60

System.XML
XSLT Stylesheet
XslTransform
XPathNavigator
XPath
XmlWriter
XmlReader
XmlDocument
XmlPathDocument
XmlDataDocument
XmlDocument
Platformy Technologiczne 2012
Odczyt XML w C#
61
XmlTextReader xtr = new XmlTextReader("Sample1.xml");
while (xtr.Read())
{
Console.WriteLine(xtr.NodeType.ToString() + ":" + xtr.Name + ":" + xtr.Value);
if (xtr.HasAttributes)
{
for (int i = 0; i < xtr.AttributeCount; i++)
{
xtr.MoveToAttribute(i);
Console.WriteLine(xtr.NodeType.ToString() + ":" + xtr.Name + ":" + xtr.Value);
}
xtr.MoveToElement();
}
}
Platformy Technologiczne 2012
Zapis XML w C#
62
XmlTextWriter xtw = new XmlTextWriter("Sample2.xml", null);
xtw.Formatting = Formatting.Indented;
xtw.WriteStartDocument();
xtw.WriteComment("to plik utworzony poprzez obiekt XmlTextWriter");
xtw.WriteStartElement("Książki");
xtw.WriteStartElement("Ksiązka");
xtw.WriteAttributeString("wydawnictwoId", "3");
xtw.WriteStartElement("ISBN");
xtw.WriteString("777-7777-777");
xtw.WriteEndElement();
xtw.WriteEndElement();
xtw.WriteEndElement();
xtw.WriteEndDocument();
xtw.Close();
Platformy Technologiczne 2012
Struktura dokumentu DOM
63



DocumentElement – wierzchołek drzewa dokumentu
Node – każdy z węzłów (w tym elementy)
Rodzaje węzłów:
 Węzły elementowe: zwykle zawierają węzły potomne: elementowe, tekstowe
lub obu rodzajów
 Węzły atrybutowe: informacja podległa konkretnemu węzłowi elementowemu.
Nie są określane jako potomkowie
 Węzeł dokumentu: rodzic dla wszystkich pozostałych węzłów
 CData: odpowiada sekcji znakowej, zawierającej zawartość nie przeznaczoną
do przetwarzania
 Comment: (komentarz); ProcessingInstruction (instr. przetwarzania)
 DocumentFragment: stosowany jako węzeł roboczy przy budowaniu lub
rekonstruowaniu dokumentu XML
 Entity, EntityReference, Notation
Platformy Technologiczne 2012
XPath
64

Ułatwia wyszukiwanie w XML pozwalając iterować po kolekcji węzłów

Podstawowe elementy (namespace System.Xml.XPath)

XPathDocument – dokument XML

XPathNavigator – przetwarzanie i parsowanie zapytań XPath

XPathNodeIterator – iterator po liście wynikowej
XPathDocument doc = new XPathDocument("test.xml");
XPathNavigator nav = doc.CreateNavigator();
XPathNodeIterator iterator = nav.Select("/items/compact-disc[1]/artist | /items/compact-disc[1]/title");
iterator.MoveNext();
Console.WriteLine("Artysta={0}", iterator.Current);
iterator.MoveNext();
Console.WriteLine("Tytuł={0}", iterator.Current);
Platformy Technologiczne 2012
Serializacja
65

Serializacja – proces zamiany obiektów na strumień danych
Deserializacja – zamiana strumienia danych na obiekt

Bazowo dostępne rodzaje serializacji:




Binarna – tworzy binarną reprezentację danych za pomocą klasy
BinaryFormatter
SOAP – serializowanie do strumienia XML zgodnego ze standardami
SOAP (SoapFormatter)
XML – serializowanie do strumienia XML (XmlSerializer)
Platformy Technologiczne 2012
Serializacja binarna
66
// Załadowanie obiektu Chair do Hashtable
Hashtable ht = new Hashtable();
// Chair i Upholstery muszą mieć atrybut [Serializable]
Chair ch = new Chair(100.00D, "Broyhill", "10-09");
ch.myUpholstery = new Upholstery("Cotton");
ht.Add("10-09", ch);
// (1) Serializacja // Stworzenie pliku docelowego
FileStream fs= new FileStream("c:\\chairs.dat", FileMode.Create);
BinaryFormatter bf= new BinaryFormatter();
bf.Serialize(fs,ht);
fs.Close();
// (2) Deserializacja pliku do Hashtable
ht.Clear();
fs = new FileStream("c:\\chairs.dat", FileMode.Open);
ht = (Hashtable) bf.Deserialize(fs);
fs.Close();
Platformy Technologiczne 2012
Serializacja binarna - zdarzenia
67
Zdarzenie
Atrybut
Opis
OnSerializing
[Serializing]
Wywoływany przed serializacją; Dla każdego
obiektu oddzielne wywołanie
OnSerialized
[Serialized]
Wywołanie po serializacji; Dla każdego obiektu
oddzielne wywołanie
OnDeserializing [Deserializing] Wywoływany przed deserializacją; Dla każdego
obiektu oddzielne wywołanie
OnDeserialized
[Deserialized]
Wywołanie po deserializacji; Dla każdego obiektu
oddzielne wywołanie
public class Chair
{
[OnDeserialized]
void OnDeserialized(StreamingContext context)
{ /* some logic */ }
}
Platformy Technologiczne 2012
Serializacja XML
68


Elementy tworzone na podstawie serializowanych obiektów klasy domyślnie
otrzymują nazwy zgodne z nazwami reprezentowanych właściwości.
Istnieją Atrybuty serializacji, za pomocą których możemy przykrywać
domyślne nazwy elementów.
XmlElement
Zmienna lub właściwość zostanie podczas serializacji zapisana jako węzeł
XmlAttribute
Dołączony do pola klasy powoduje wygenerowanie jako atrybutu w elemencie.
XmlIgnore
Pole jest omijane podczas serializacji.
XmlText
Atrybut dołączony do pola powoduje serializację jako tekstu.
Nazwa pola zostaje ominięta.
Platformy Technologiczne 2012
Serializacja XML - przykład
69
public class movies
{
public int movieID
{}
public string movie_Title
{}
public int movie_Year
{}
public string movie_Director
{}
public string bestPicture
{}
[XmlElement("AFIRank")]
public int rank
{}
<?xml version="1.0" standalone="yes"?>
<movies>
<movie_ID>5</movie_ID>
<movie_Title>Citizen Kane </movie_Title>
<movie_Year>1941</movie_Year>
<movie_DirectorID>Orson Welles</movie_DirectorID>
<bestPicture>Y</bestPicture>
<AFIRank>1</AFIRank>
</movies>
}
Platformy Technologiczne 2012
Garbage Collector
70




Służy do zarządzania pamięcią
Różne cele na różnych maszynach (serwer / stacja
robocza)
Namespace System.GC
Podstawowe techniki:
 Zliczanie
referencji
 Graf osiągalności (reachabiliy graph)

Nie zaleca się manualnego wywoływania
Platformy Technologiczne 2012
Finalizatory
71



Uruchamiane przez GarbageCollector przed
zwolnieniem zasobu
Wywoływane niedeterministycznie
Można wymusić automatyczne wywołanie
 GC.SuppressFinalize

Finalizacja wymaga 2 cykli GarbageCollectora
1
– przesuniecie obiektu do kolejki finalizacji,
wywołanei finalizatora
 2 – zwolnienie zaalokowanej pamięci
Platformy Technologiczne 2012
Destruktory
72



Wołane, gdy obiekt „ulega zniszczeniu”
Wykorzystywane do zwolnienia zasobów
alokowanych przez obiekt
Wykonywane strategią bottom-up
Platformy Technologiczne 2012
Automatyczne zwalnianie zasobów
73

Interfejs IDisposable

using

Wykorzystywany do zwalniania
zasobów niezarządzanych (np.
pliki)

Automatyczne wywołanie metody
Dispose() po zakończeniu cyklu
życia obiektu

Dostęp przez medotę Dispose()


Można wywoływać z własnego
kodu
Pozwala na deklarowanie wielu
obiektów
SqlConnection connection;
try
{
connection = new SqlConnection();
}
catch (SqlException se)
{
//obsługa wyjatku
}
finally
{
connection.Close();
connection.Dispose();
}
using (SqlConnection connection = new SqlConnection())
{
//kod programu
}
Platformy Technologiczne 2012