200 kb

Transkrypt

200 kb
Metodyka programowania
Podstawy C#
Platforma .NET
Platforma .NET (.NET Framework)
• Platforma programistyczna Microsoft,
• Obejmuje
- środowisko uruchomieniowe CLR (Common Language
Runtime)
- biblioteki klas
• Programy mogą być pisane w jednym z wielu języków
(C++, C#, F#, J#, Delphi, Visual Basic)
• Umożliwia uruchamianie programów na serwerze IIS (Internet
Information Services) oraz na systemach z implementacją .NET
• Zgłoszony standard EMCA, powstają niezależne wdrożenia,
np. Mono (UNIX, Linux, Android, …)
Platforma .NET
Struktura .NET
Biblioteki
Windows.Forms
ADO.NET
WebServices
ASP.NET
XML, SQL
BCL (Base Class Library)
Środowisko uruchomieniowe CLR
(Common Language Runtime)
Platforma .NET
Środowisko uruchomieniowe CLI
C#
J#
C++
Biblioteki .NET
Kod IL
Obsługa
wykonywania
Kompilator JIT
(Just in Time)
Bezpieczeństwo
Zarządzanie
pamięcią
Kod maszynowy
Procesor
Platforma .NET
Wersje .NET
• 1.0
• 2.0
• 3.0
• 3.5
• 4.0
• 4.5
(2002
(2005
(2006
(2007
(2010
(2012
r.)
r.),
r.),
r.),
r.)
r.),
Windows Server 2003
Windows Server 2008, Windows Vista
Windows 7
Windows Server 8, Windows 8
C#
Najważniejsze cechy C#
• Obiektowość
kod programu jest zbiorem klas; typy proste (int, double, itd.)
również są strukturami
• Odśmiecanie pamięci
zarządzaniem pamięcią zajmuje się środowisko uruchomieniowe
• Wiele nowoczesnych rozwiązań
właściwości, indeksery, delegacje, zdarzenia, refleksje, …
(wiele zapożyczonych z języka Java)
• Bogate biblioteki klas
dla aplikacji konsolowych (System), okienkowych
(Windows.Forms), bazodanowych (ADO.NET), sieciowych
(System.Net), w architekturze rozproszonej (WebServices),
dynamicznych aplikacji internetowych (ASP.NET) oraz
multimediów (Silverlight).
C#
Wspólny system typów CTS
Obiekt
Klasa
Typy proste
Interfejs
Typy wyliczeniowe
Tablica
Struktury
Typy referencyjne
Typy wartościowe
C#
Typy wartościowe
• Deklaracja
deklarowany (tworzony) jest obiekt
Int32 x;
x = 7;
• Przypisanie
obiekt jest kopiowany
Int32 a, b;
a = 13;
b = a;
(są dwa obiekty Int32, oba zawierają wartość 13)
C#
Typy referencyjne
• Deklaracja
deklarowana (tworzona) jest referencja, obiekt nie istnieje
dopóki nie zostanie utworzony operatorem new
Button b1;
b1 = new Button();
• Przypisanie
kopiowany jest nie obiekt, tylko referencja do niego
Button b2;
b2 = b1;
(jest jeden obiekt Button, obie referencje wskazują na niego)
Typy proste C#
Typy proste:
• Boolean (alias: bool)
wartości logiczne true i false
• Int32 (alias: int)
wartości całkowite
ze znakiem: SByte, Int16, Int32, Int64
bez znaku: Byte, UInt16, UInt32, UInt64
• Double (alias: double)
Single (alias: single, float)
• Char (alias: char)
znak Unicode, 16-bitowy
• String (alias: string)
Typy proste C#
Typy proste są strukturami;
dostarczają wiele użytecznych metod:
• ToString – konwersja na łańcuch zanków
• Parse – konwersja z łańcucha znaków
• TryParse – jak Parse, ale z obsługą błędów
Int32 a;
a = Int32.Parse("32");
Double x, y;
x = Double.Parse("4,1");
y = 1.25;
Boolean ok;
ok = Int32.TryParse("abc", a);
Typy proste C#
Metody typów prostych - Int32
• Statyczne (klasy)
Int32 MinValue
Int32 MaxValue
Int32 Parse (String s)
Boolean TryParse (String s, Int32 v)
• Instancji
Int32 CompareTo (Int32 v)
Boolean Equals (Int32 v)
String ToString ()
String ToString (String format)
Typy proste C#
Metody typów prostych - Double
• Statyczne (klasy)
Double MinValue
Double MaxValue
Double NaN
Double Epsilon
Double NegativeInfinity
Double PositiveInfinity
Double Parse (String s)
Boolean TryParse (String s, Double v)
• Instancji
Int32 CompareTo Double v)
Boolean Equals Double v)
Boolean IsNaN ()
Boolean IsInfinity ()
String ToString ()
String ToString (String format)
Typy proste C#
Konwersje typów prostych
• Konwersja automatyczna jest możliwa, gdy nie ma ryzyka
utraty wartości lub pogorszenia precyzji:
Int32 a;
Int16 b = 77;
a = b;
w przeciwnym razie jest błędem składniowym:
b = a;
// błąd: Int16 <- Int32
Single y;
y = 1.25; // błąd: Single <- Double
• Można stosować konwersje wymuszone:
b = (Int16) a;
Identyfikatory
Nazwy, które programista nadaje zmiennym, funkcjom,
klasom, itd.:
- litery a..z, A..Z, cyfry 0..9 oraz znak podkreślenia "_"
można używać znaków diakrytycznych (ą, ę, …)
- nie może zaczynać się od cyfry
- małe i wielkie litery są rozróżniane
wsp1, wsp_1,
suma_liczb, SumaLiczb, sumaLiczb
nazwa, Nazwa, NAZWA
Najbardziej popularna jest notacja Camel (wielbłądzia):
toJestPrzykładNotacjiCamel
Literały
Napis reprezentujący wartość, która może być
zapisana w zmiennej lub użyta w wyrażeniu.
• Każda stała ma ściśle określony typ
(tj. najprostszy typ, w jakim stałą można by zapisać):
100
– typ całkowity, int
17.5
– typ rzeczywisty, double
1.75e01 – jw.
"hello" – łańcuch znaków, string
'A'
– typ znakowy, char
Operatory – hierarchia i wiązanie
przyrostkowe
przedrostkowe
jednoargumentowe
dwuargumentowe
przesunięcia
relacji
równości
logiczne
warunkowy
przypisania
++ -++ -+ * / %
+ << >>
< <= >= >
== !=
&&
||
?:
= += -= *= /=
lewe
prawe
prawe
lewe
lewe
lewe
lewe
lewe
lewe
lewe
prawe
prawe
Operatory
Hierarchia operatorów
• Określona dla danego języka programowania kolejność
operatorów, uwzględniana przy obliczaniu wyrażeń.
Np. w wyrażeniu
y = a + b * c;
najpierw wykonywane jest mnożenie, później dodawanie i
dopiero na końcu przypisanie (ponieważ operator mnożenia stoi
w hierarchii wyżej, niż operator dodawania, a ten wyżej, niż
operator przypisania). Aby zmienić kolejność wykonywania
operatorów, należy stosować nawiasy, np.:
y = (a + b) * c;
Operatory
Wiązanie operatorów
• Określona dla danego języka programowania kolejność
wykonywania operatorów o tej samej hierarchii. Większość
operatorów ma wiązanie lewe (tzn. wykonywane są od lewej do
prawej). Nieliczne, w tym operatory przypisania, maja wiązanie
prawe.
Np. w wyrażeniu
y = a / b * c;
najpierw jest wykonywane dzielenie, a dopiero potem mnożenie
– czyli y jest obliczane jako (a/b)*c;
Aby zmienić kolejność wykonywania operatorów, należy
stosować nawiasy, np.:
y = a / (b * c);
Instrukcje
Instrukcja pusta
;
• Stosowana wówczas, gdy składnia wymaga podania instrukcji,
ale nic nie ma być wykonane
• Na ogół użycie instrukcji pustej jest błędem
"błąd nadgorliwości":
if (x==0);
y = 1;
instrukcja y=1; jest wykonywana zawsze, niezależnie od
warunku, ponieważ z warunkiem związana jest instrukcja pusta
(średnik po nawiasie)
Instrukcje
Instrukcje:
• Pusta
• Grupująca (blok instrukcji)
• Warunkowa
if, if-else
• Iteracyjne
for, while, do-while, foreach
Instrukcje
Instrukcja grupująca
(blok instrukcji)
{
// dowolna ilość instrukcji
}
• Stosowana wówczas, gdy składnia pozwala na podanie jednej
instrukcji, a potrzeba użyć więcej.
Instrukcje
Instrukcja wyrażeniowa
wyrażenie ;
• Dowolne wyrażenie (tj. poprawna składniowo kombinacja nazw
zmiennych, operatorów oraz stałych), zakończone średnikiem.
Instrukcje
Instrukcja warunkowa
if (warunek)
instrukcja
• "warunek" – dowolne wyrażenie o rezultacie całkowitym,
"instrukcja" – dowolna instrukcja (w tym wyrażeniowa,
grupująca, warunkowa, ...)
• Działanie: jeżeli wyrażenie "warunek" daje rezultat true,
"instrukcja" jest wykonywana, w przeciwnym przypadku pomijana
Instrukcje
Instrukcja warunkowa
if (warunek)
instrukcja1
else
instrukcja2
• Jeżeli wyrażenie "warunek" daje rezultat true, wykonywana jest
"instrukcja1", w przeciwnym przypadku - "instrukcja2"
Instrukcje
Instrukcje iteracyjne
for (inicjalizacja; warunek;
inkrementacja)
instrukcja
• Wykonywane jest wyrażenie "inicjalizacja" oraz sprawdzany
"warunek"; Jeżeli "warunek" daje rezultat true, to wykonywana
jest "instrukcja", a następnie "inkrementacja", po czym
czynności są powtarzane, począwszy od "warunku"; Jeżeli
"warunek" daje wartość false, wykonywanie instrukcji for
zostaje zakończone;
Instrukcje
Instrukcje iteracyjne
while (warunek)
instrukcja
• Działanie: wykonywany jest "warunek"jeżeli "warunek" daje
rezultat niezerowy, wykonywana jest "instrukcja"; jeżeli
"warunek" daje wartość zero, wykonywanie instrukcji while
zostaje zakończone;
następnie czynności są powtarzane,
począwszy od "warunku".
Obsługa wyjątków
Wyjątek programowy
• Wyjątek (exception) - mechanizm obsługi sytuacji wyjątkowych,
przede wszystkim błędów
• Wyjątek jest rzucany (throw), aby zgłosić sytuację wyjątkową
• Wyjatek jest przechwytywany (catch), aby obsłużyć tę sytuację;
Jeżeli wyjątek nie zostanie przechwycony, aplikacja zostaje
awaryjnie zatrzymana, o czym informuje komunikat:
Obsługa wyjątków
Przykład wyjątku programowego
Przykład: program wczytuje ciąg znaków podany przez
użytkownika po czym próbuje przekształcić go na liczbę przy
pomocy Parse; metoda Parse nie może przekształcić łańcucha
znaków (np. s="1#3") na wartość typu całkowitego i dlatego
rzuca wyjątek
Int32 n = 0;
String s;
s = Console.ReadLine();
// tu może pojawić się wyjątek:
n = Int32.Parse(s);
Obsługa wyjątków
Typy wyjątków programowych
• Rzuceniu wyjątku towarzyszy utworzenie obiektu wyjątku.
Typ wyjątku wynika z rodzaju błędu, natomiast obiekt wyjątku
może zawierać dodatkowe, szczegółowe informacje o błędzie
• Np. metoda Parse może rzucać trzy typy wyjątków:
– ArgumentNullExceptions
– FormatException
– OverflowException
Obsługa wyjątków
Obsługa wyjątków
• Do obsługi wyjątków służy instrukcja try-catch
• W bloku "try" należy umieścić instrukcje potencjalnie
"niebezpieczne" (mogące zakończyć się błędem)
oraz instrukcje od nich zależne
• W bloku (blokach) "catch" należy umieścić instrukcje obsługi
błędu (błędów)
Można napisać kilka bloków "catch" – oddzielnie dla każdego
typu wyjątku, albo jeden wspólny
• Jeżeli jedna z instrukcji bloku "try" rzuci wyjątek,
to wykonywanie tego bloku zostaje przerwane, po czym
są wykonywane instrukcje bloku "catch";
Jeżeli w bloku "try" wyjątek nie wystąpi, to blok "catch"
nie jest wykonywany
Obsługa wyjątków
Obsługa wyjątków
• Najprostszy wariant – jeden blok "catch" dla wszystkich typów
wyjątków:
try
{
// instrukcje mogące rzucić wyjątek
// instrukcje zależne od w/w
}
catch
{
// obsługa wszelkich możliwych wyjątków
}
Obsługa wyjątków
Obsługa wyjątków
• Trudniejszy wariant –bloki "catch" dla różnych wyjątków:
try
{
// instrukcje mogące rzucić wyjątek
// instrukcje zależne od w/w
}
catch (FormatException e)
{
// obsługa wyjątku
}
catch (OverflowException e)
{
// obsługa wyjątku
}
Typy wyliczeniowe C#
Typy wyliczeniowe
• Służą do definiowania zbioru dopuszczalnych wartości
enum Color {
Red,
Green,
Blue
}
Color color = Color.Red;
• Dzięki ścisłej kontroli typów w C# gwarantują używanie zawsze
poprawnych wartości
Tablice C#
Tablice są typami referencyjnymi
• Po deklaracji musi następować utworzenie tablicy:
Int32[] ti;
ti = new Int32[3];
• Utworzeniu może towarzyszyć nadanie wartości:
Double[] td;
td = new Double[3] { 1.0, 2.0, 3.5 };
Dostęp do elementów tablicy umożliwia indeksowanie
• Indeksy elementów: od 0 do rozmiar-1
for (i=0; i<3; i++)
s += td[i];
Klasy C#
Klasa
• definicja typu (definicja obiektu)
Obiekt
• instancja klasy;
• zmienna, której definicją jest klasa
Pole
• element składowe klasy (obiektu), służący do przechowywania
danych
• może być typu wartościowego lub referencyjnego
…
Klasy C#
…
Metoda
• funkcja będąca elementem składowym klasy
• mogą być przeciążone
• istnieją funkcje o specjalnym przeznaczeniu:
konstruktor (można przeciążać) i destruktor
Właściwość
• połączenie pola i dwóch metod
(służących do odczytu i zmiany wartości pola)
Klasy C#
Pola (inaczej: atrybuty) klasy
• Składnia:
[Modyfikator] typ nazwa;
[Modyfikator] typ nazwa = wartość;
- Pola statyczne należą do klasy (a nie do instancji);
pola prywatne są dostępne tylko dla metod danej klasy,
natomiast nie są dostępne spoza tej klasy;
- Pola typu referencyjnego – należy pamiętać o konieczności
utworzenia obiektów operatorem new
• Przykłady
static Double InchCmRatio = 2.54;
private Int32 x = 0;
Klasy C#
Metody (inaczej: operacje) klasy
• Składnia:
[Modyfikator] typ nazwa (argumenty)
{
// ciało metody
}
- Typ rezultatu – dowolny typ C# lub void (ang. brak);
Metoda powinna dostarczać rezultat przy pomocy instrukcji
return (nie dotyczy funkcji z typem rezultatu void)
- Na ogół metody wykonują operacje w obrębie własnej klasy
(np. zmieniają wartość pól obiektu)
• Przykłady
public Double ToCm()
{
return inches * InchCmRatio;
}
Klasy C#
Modyfikatory dostępu klasy i elementów składowych
• public
- element dostępny bez ograniczeń,
• internal
- dostępny tylko wewnątrz danego zestawu (ang. assembly),
np. tylko dla innych klas tego samego projektu
• private (domyślny!)
- niedostępny z zewnątrz
• static
- element należący do klasy a nie do instancji (obiektu)
- klasa, dla której nie można utworzyć obiektów
• const
- element, którego wartość jest nadawana w deklaracji
i nie może być później zmieniona
Klasy C#
Przykład klasy – elementy statyczne
public static class Inches
{
public static Double InchCmRatio = 2.54;
public static Double InchToCm(Double inch)
{
return inch * InchCmRatio;
}
}
Klasy C#
Przykład klasy
public static class Inches
{
[…]
}
- Klasa jest publiczna (tj. dostępna bez ograniczeń);
- Klasa jest statyczna (tj. nie można utworzyć obiektu klasy,
podobnie jak klas Console czy Math)
Klasy C#
Przykład klasy
• Przykład użycia
Double lenCm = Inches.InchToCm (10);
Double lenInch = lenCm / Inches.InchCmRatio;
Klasy C#
Przykład klasy
public class Inch
{
private const Double InchCmRatio = 2.54;
private Double val;
public Inch(Double v)
{
val = v;
}
public Double ToCm()
{
return val * InchCmRatio;
}
}
Klasy C#
Przykład klasy
public class Inch
{
[…]
}
- Klasa jest publiczna (tj. dostępna bez ograniczeń;
- Nazwa klasy (Inch) funkcjonuje jak nazwa typu zmiennych,
podobnie jak np. Double, jednak jest to typ referencyjny
- obiekty trzeba tworzyć operatorem new
Klasy C#
Przykład klasy
• Pole (prywatne)
private Double val;
[…]
• Pole nie jest dostępne z zewnątrz (tj. spoza klasy),
ale może być modyfikowane oraz odczytywane przez medody
należące do klasy;
• Pole nie jest statyczne, zatem należy do obiektów (instancji),
a nie do klasy jako całości
• Wartość pól powinna być podana przy ich deklaracji
lub nadawana przez konstruktor klasy
Klasy C#
Przykład klasy
• Konstruktor – metoda używana do tworzenia obiektu
(podczas działania operatora new)
public Inch(Double v)
{
val = v;
}
[…]
• Przykład użycia
Każda klasa definiuje typ referencyjny – użycie new jest
konieczne, inaczej istnieje tylko referencja, a nie obiekt!
Inch inch;
inch = new Inch(3);
Klasy C#
Przykład klasy
• Metoda (publiczna)
public Double ToCm()
{
return inches * InchCmRatio;
}
[…]
• Przykład użycia
Double lenCm;
Inch inch new Inch(3);
lenCm = inch.ToCm();
Klasy C#
Przykład klasy
public class Inch
{
private const Double InchCmRatio = 2.54;
private Double val;
public Inch(Double v)
{
val = v;
}
public Double Cm
{
get { return ToCm(); }
set { val = value / InchCmRatio; }
}
}
Klasy C#
Przykład klasy
• Właściwość (publiczna)
public Double Cm
{
get { return val * InchCmRatio }
set { val = value / InchCmRatio; }
}
• Przykład użycia
(właściwości używa się jak pola, choć kryją się za nim
operacje, zdefiniowane w sekcjach get oraz set definicji)
Inch inch = new Inch(3);
Double lenCm;
lenCm = inch.Cm;
inch.Cm = 15;
Aplikacje konsolowe C#
Aplikacje konsolowe
• Środowisko MSVS umożliwia tworzenie aplikacji konsolowych
- uruchamianych w klasycznym, czarnym oknie konsoli
• Kreator MSVS tworzy projekt zawierający:
- włączenie typowych bibliotek
- przestrzeń nazw
(można w niej umieszczać własne klasy)
- klasę Program
- statyczną metodę Main
Aplikacje konsolowe C#
Funkcja główna programu
• Każdy program musi zawierać funkcję główną (jak w C++);
wykonanie programu polega na wykonaniu funkcji głównej.
Aplikacje konsolowe C#
Przydatne klasy C#
• Math
- klasa definiująca statyczne metody matematyczne,
jak pierwiastek, potęga, logarytm, sinus itd. itp
Double Sqrt (Double x);
Double Pow (Double b, Double e);
- oraz dwie stałe: liczby Π oraz e
public const Double PI = 3.14159265358979;
public const Double e = 2.718281828459045;
Aplikacje konsolowe C#
Przydatne klasy C#
• Console
- klasa definiująca szereg statycznych metod do obsługi
konsoli (odpowiednik strumieni cin oraz cout w C++)
- najważniejsze metody:
void WriteLine (String line);
String ReadLine ();
ConsoleKeyInfo ReadKey (Boolean noEcho);
Aplikacje konsolowe C#
Metody klasy Console
• WriteLine – wyświetla tekst i przechodzi do nowej linii
- wyświetlenie łańcucha znaków
Console.WriteLine ("Hello");
- wyświetlenie wartości zmiennej
Console.WriteLine (x.ToString());
- wyświetlenie kilku informacji
Console.WriteLine ("Wynik = " + x);
Console.WriteLine (
String.Format("Suma {0} i {1} = {2}",a,b,s)
);
Aplikacje konsolowe C#
Metody klasy Console
• ReadLine – wczytuje tekst wpisany z klawiatury
(do naciśnięcia <Enter>)
- wczytanie łańcucha znaków i konwersja na liczbę
String ln;
Double x;
ln = Console.ReadLine ();
x = Double.Parse(ln);
- jw., ale z wykrywaniem błędów
Boolean ok;
ok = Double.TryParse(ln, out x);
Aplikacje konsolowe C#
Przykład aplikacji konsolowej C#