Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

C#

No description
by

Jerzy Mur

on 13 November 2014

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of C#

C#
Historia
Zacznijmy od Javy
1991 - firma Sun, projekt Green. Cele:
multiplatformowość
obiektowość
1996 - start na rynku (mało udany)
1998 - wydanie wersji 1.2 (zakończone sukcesem)
2002 - Java 1.4: internet
2006 - przejęcie przez Oracle
C# - konkurenci
język niezorientowany
obiektowo
manualne zarządzanie
pamięcią
skomplikowane
Windows API
brak dziedziczenia
brak konstruktorów
parametrycznych
przedziwna arytmetyka
wskaźników
brak wsparcia dla integracji
między językami
"single language for every need"
C
Visual Basic
C++
Java
brak wielowątkowości
C# - cele
zorientowany obiektowo
niezależny od platformy

pozbawiony wskaźników pisanych explicite
wyposażony w garbage collector
upraszczający pisanie aplikacji

umożliwiający pracę wielowątkową
zorientowany strukturalnie
zależny od konkretnego zestawu instrukcji procesora
komplikujący używanie zmiennych
ułatwiający powstanie wycieków pamięci
nie wyposażony w mechanizmy przyśpieszające tworzenie aplikacji
jednowątkowy
.NET
C# - kalendarium
1999 - Cool: "C-like Object Oriented Language"

Anders Hejlsberg - Turbo Pascal, Borland Delphi
2002 - C# 1.0
2006 - C# 2.0
klasy statyczne
typy generyczne
iteratory
nullable types
delegaty
opakowanie atrybutów w pola
C# - kalendarium c.d.
2007 - C# 3.0
pola implementowane automatycznie
typy anonimowe
wyrażenia lambda
metody częściowe
2010 - C# 4.0
argumenty nazywane i ich domyślne wartości
dynamic binding
kowariancja i kontrawariancja
2013 - C# 5.0
Compiler-as-a-service (Roslyn)
Czym jest .NET?
".NET Framework to szereg niezbędnych bibliotek umożliwiających tworzenie aplikacji na platformę .NET.
Zadaniem .NET Framework jest zarządzanie przeróżnymi elementami systemu, których obsługa do tej pory zajmowała programistom najwięcej czasu." [1]
Cechy .NET
współpraca z istniejącym kodem
wsparcie dla wielu języków programowania
C#, Visual Basic, C++/CLI, F#,
J#
,

Python, Perl, Lisp
wspólne środowisko uruchomieniowe dla wszystkich powyższych języków
przykład: zbiór typów danych rozumianych przez wszystkie języki
całkowita integracja między językami
dziedziczenie
, obsługa błędów, debugowanie
wszechstronna biblioteka standardowa
bufor między WinAPI a programistą
biblioteki dzielone z innymi językami programowania
uproszczenie rozwoju oprogramowania
brak konieczności rejestrowania biblioteki *.dll w rejestrze systemu
umożliwienie współistnienia wielu wersji tej samej biblioteki *.dll na jednej maszynie
Technologie pochodne
ADO.NET: Active Data Objects
wysokiego poziomu interfejs dostępowy do relacyjnych baz danych
ASP.NET: Active Server Pages
framework do generowania dynamicznych stron internetowych
rozszerzenie: *.aspx
CLR
CTS
CLS
Common Language Runtime
Common Language Runtime
Co to?
CLR to maszyna wirtualna na której operują programy napisane w .NET.
Za co odpowiada?
załadowanie programu do pamięci
przydział i zarządzanie pamięcią w trakcie wykonywania programu
obsługa błędów
Po co?
współpraca wielu języków programowania
obsługa wielu platform (wraz z optymalizacją, np. x86 vs x64)
ułatwienie pisania programów dzięki uniemożliwieniu zaistnienia wielu rodzajów błędów
Kompilacja JIT (Just In Time)
"Kompilacja w locie"
Fragment kodu kompilowany jest w momencie pierwszego wystąpienia. Od tego momentu istnieje w pamięci już jako ciąg instrukcji procesora, każde kolejne wywołanie wiąże się już tylko z ich wykonaniem.
- Przy pierwszym pojawieniu się metody, czy klasy działa wolniej (konieczność kompilacji). Potem już tak samo szybko jak w kompilacji statycznej.
+ Jeżeli dany fragment kodu nie zostanie wywołany w trakcie działania aplikacji - nigdy nie zostanie skompilowany.
Zarządzanie pamięcią
Sterta
Stos
adres
wartość
Odśmiecacz (Garbage Collector)
1. Tworzymy
2. Używamy
3. Porzucamy
Cykl życia obiektu:
CLR samo dba o to, aby nie powstawały wycieki pamięci. Używa do tego odśmiecacza. Programista nie musi martwić się niszczeniem obiektu, wystarczy, że przestanie go używać.
Programista nie musi martwić się tym kiedy nastąpi odśmiecanie. Włączenie GC jest zależne od wielu czynników, np. ilość wolnej pamięci, szybkość pojawiania się nowych obiektów ostatnim czasie itd. W ostateczności użytkownik zauważy spadek wydajności na ułamek sekundy, kiedy CLR zatrzyma program aby wykonać odśmiecanie.
Odśmiecacz c.d.
Kod zarządzany i niezarządzany
Na wyraźne życzenie programisty CLR ma możliwość uruchomić część kodu poza środowiskiem uruchomieniowym. Oczywiście w takim wypadku cała odpowiedzialność za zarządzanie pamięcią spada na programistę, jednakże dodanie takiej opcji ma sens z przynajmniej dwóch powodów:
kompatybilność wsteczna: dzięki temu mechanizmowi mamy możliwość korzystać z bibliotek i modułów nie napisanych w .NET
wydajność: działanie maszyny wirtualnej, odśmiecacza itd. nie pozostaje bez wpływu na szybkość wykonywania się kodu. W mało wymagających obliczeniowo zadaniach nie jest to problemem, jednakże nierzadko opłaca konkretne zadanie obliczeniowe przeprowadzić z zachowaniem ostrożności poza CLR, do właściwego programu pobierając jedynie wyniki
Common Type System
Common Type System
Każdy język programowania w środowisku .NET korzysta tak naprawdę z dokładnie takich samych typów danych. Ich nazwy mogą być specyficzne dla języka, są jednak tylko aliasami dla typów z przestrzeni nazw System.
Istnieją dwa rodzaje typów danych:
typy proste (skalarne)
wartość
przechowywana na
stosie
typy referencyjne
na
stosie
przechowywany tylko
wskaźnik
do odpowiedniego miejsca na
stercie
Typy danych - struktura
Typy danych - budowa

Typy danych - struktura

Opakowywanie i odpakowywanie
Czyli boxing i unboxing
Nullable Types
Typy dopuszczające wartości zerowe
Common Language Specification
Wspólna specyfikacja dla
języków programowania
Platforma .NET dokładnie określa jakie wymagania powinien spełniać język aby mógł zostać włączony do grona obsługiwanych przez CLR.
Na przykład:
indeksowanie tablic od 0
możliwość tworzenia klas statycznych
obsługa wspólnych typów danych (CTS)
CLS - schemat działania
CLS - wnioski
Dzięki wspólnej specyfikacji dla wszystkich języków działających wewnątrz platformy .NET jest możliwa
bardzo
elastyczna współpraca między programistami piszącymi w różnych językach programowania.
Jeden współpracownik może bez najmniejszego problemu używać klas czy metod napisanych przez innego współpracownika piszącego w zupełnie innym języku programowania.
Programiści mają też szersze możliwości wykorzystywania już napisanych modułów, kwestia tego w jakim języku zostały napisane traci na znaczeniu, pozostaje tylko i wyłącznie pytanie czy dana biblioteka implementuje potrzebne zagadnienia.
Kolekcje
Po co nam zaawansowane struktury danych?
Jak sprawdzić czy tablica zawiera dany element?
Jak zmienić rozmiar tablicy?
Jak posortować tablicę?
Jak wstawić nowy element w konkretnym miejscu?
Jak usunąć element na konkretnej pozycji?
Czym się różni Tablica od Kolekcji?
Czym dysponujemy w C#?
1. Array List
2. Queque (Kolejka)
3. Stack (Stos)
4. Hashtable (Tablica mieszająca)
5. SortedList
Tablica przechowuje
wartości
, a kolekcja
obiekty
.
Array List #1
"ArrayList można traktować jak ulepszenie tablicy. Jeśli irytowały cię pewne wady tablicy, to ta klasa większość ich rozwiąże . Potrafi ona:
Usuwać wybrane elementy z kolekcji przy użyciu metody
Remove()
. Elementy automatycznie ustawią się w wybrane miejsca.
Za pomocą metody
RemoveAt()
usuwa się dany element przy pomocy jego indeksu.
Dodawać kolejne nowe elementy za pomocą metody
Add()
. W razie potrzeby ArrayList automatycznie zmieni swój rozmiar.
Dodawać elementy w środku zbioru elementów za pomocą metody
Insert()
.
Może odnieść referencyjnie do istniejącego elementu w ArrayList za pomocą nawiasów kwadratowych i numeru indeksu elementu." [3]
Kolejka
"Klasa Queue implementuje mechanizm
FIFO
. Element umieszczony w kolejce zawsze znajduje się na jej końcu, a element wychodzący jest pobierany z jej początku. Niczym kolejka ludzi np. po zakupy. Osoba przychodząca do kasy w sklepie ustawia się w kolejce , a osoba na jej początku realizuje swoje płatności.

Wyciąganie elementów z kolejki odbywa się za pomocą metody
Dequeue()
, a za pomocą metody
Enqueue()
elementy trafiają do kolejki.

Moim zdaniem np. gdybyśmy chcieli napisać aplikację teleturniejową z pytaniami, które nie mogą się powtarzać , a zarazem musiałyby one trafiać na koniec kolekcji pytań (np.w wypadku błędnej odpowiedzi), to kolejka fantastycznie nadawałaby się do tego celu." [3]
Stack (Stos)
Kolekcja Stack implementuje mechanizm LIFO. Element jest dodawany na wierzch stosu, a elementy opuszczane są też z wierzchu stosu.

Pomyśl o stosie jako o książkach, które są ułożone jedna na drugiej. Nie możesz wyciągnąć książki ze środka, możesz wyciągać książkę zaczynając od góry stosu. W ten sposób do stosu możesz dodawać książki tylko na górze zbioru.

Za pomocą metody
Push()
dodajemy elementy do stosu.
Za pomocą metody
Pop()
elementy te wyciągamy.
Za pomocą metody
Peek()
podglądamy element na górze stosu nie zdejmując go.
Hash Table
Jak do tej pory widziałeś tablice są mapowane za pomocą indeksów w postaci liczb całkowitych. Jednak do dyspozycji mamy też tablice, w których indeksy mogą być innego typu, jak np. string, doube, czy nawet DateTime.

HashTable jest taką tablicą. Jej zawartość składa się z dwóch tablic . Jedna tablica przechowuje
klucze
druga
wartości
przypisane tym kluczom. Klucze nie mogą się powtarzać. Gdy taka sytuacja nastąpi zostanie rzucony wyjątek. Na szczęście do dyspozycji mamy metodę
ContainsKey()
, która może sprawdzić, czy dany klucz już istnieje.
Zauważ , że w pętli foreach elementy wyciągane z Hashtable są klasami DictionaryEntry. Klasa ta zawiera dwie właściwości Key i Value, które pozwalają uzyskać dostęp do wartości, bądź klucza w Hashtable. Klucz i wartości są obiektami.
"SortedList działa podobnie jak Hashtable, więc też mamy do czynienia z kluczami i wartościami. Zasady jej użycia też są te same.

Ta kolekcja jest jednak sortowana. Jak to działa?

Kiedy umieszczasz klucz/wartości do SortedList, klucze są umieszczone w swojej tablicy posortowane. Czyli każde umieszczenie klucz/wartości powoduje sortowania umieszczonego klucza w odpowiednim miejscu. W trakcie sortowania program pilnuje, aby klucze i wartości były odpowiednio synchronizowane, więc sortowanie nie uszkodzi kolekcji." [3]
Sorted List
Bonus: inicjalizacja kolekcji gotowymi wartościami
C# 3.0
C# 6.0
OOP
b
j
ec
t
r
i
e
n
t
e
d
r
o
g
r
a
m
m
i
n
g
Zmiana podejścia
Dotychczas to Ty pisząc programy dostosowywałeś się do sposobu pracy komputera. Aby rozwiązać problem musiałeś tak go przedstawić, aby przedstawiał ciąg prostych instrukcji następujących jedna po drugiej.
Obiektowe nastawienie do programowania to inna perspektywa, skupienie się na zadaniu jakie program ma spełniać, a nie tym jak komputer ma to zadanie wykonać.
"Programowanie obiektowe jest próbą przedstawienia świata rzeczywistego i relacji w nim zachodzących, za pomocą obiektów."
[4]
Przykład: system audio
Głośnik
średnie i wysokie tony
Subwoofer
niskie tony
Radio
odbieranie sygnału
Odtwarzacz CD
Gramofon
Komponenty wyposażone są w standardowe złącza. Kupując np. odtwarzacz CD innego producenta nadal jest możliwość stworzenia takiego systemu - dopóki każdy producent przestrzega wspólnych reguł, co do których się zobowiązał.
Tworząc np. własny moduł radia - z jednej strony musimy zapewnić standardowe wyjście audio o odpowiednim oporze, dające odpowiednie napięcie, ale z drugiej strony: nie musimy się martwić pozostałymi elementami systemu. My nie wiemy nic o strukturze wewnętrznej głośnika, głośnik nie wie skąd otrzymuje sygnał i jak jest on wytwarzany.
Każdy obiekt działa
niezależnie
komunikując się z innymi za pomocą z góry ustalonych reguł.
Bibliografia
asdf
1. Boduch Adam,
Wstęp do programowania w języku C#
, Helion, 2006
2. Troelsen Andrew,
Pro C# 2010 and the .NET 4 Platform, Apress
, 2010
3. Cadenhead Rogers,
Sams Teach Yourself Java in 21 Days (Covering Java 7 and Android) (6th Edition)
, Sams, 2012
4. Walenciuk Cezary,
Jak programować
, www.cezarywalenciuk.pl
5. Dokumentacja języka C#, www.msdn.microsoft.com
Full transcript