You are on page 1of 54

Jzyk C# 2.

0
Szybki kurs

Wojciech Jaworski

Jzyk C#
Najwaniejszy jzyk programowania dla platformy .NET
Obiektowy, prosty, nowoczesny i bezpieczny
Najbardziej wszechstronny, pozwala korzysta ze wszystkich moliwoci
platformy
atwy do nauki bardzo due podobiestwo do Javy
Gwny architekt Anders Hejlsberg
Obecna wersja 2.0 ukazaa si w padzierniku 2005
W przygotowaniu wersja 3.0

C#

VB.NET

Web Forms

J#

C++

PERL, Python, ...

Windows Forms

Web Services

ADO.NET i XML
.NET Framework Class Library
Common Language Runtime (CLR)
Message
Queueing

COM+
System operacyjny (Win 32)

IIS

WMI

Hello world!
using System;
class Hello
{
public static void Main()
{
Console.WriteLine("Hello world!");
}
}

Co na pocztek warto wiedzie o Console


Podstawowy strumie wejcia-wyjcia w aplikacjach konsolowych
Obsuguje czytanie i pisane, przemieszczanie kursora po konsoli, zmian
ustawie klawiatury a nawet ustawienie koloru ta i obsug goniczka
systemowego
Pozwala na formatowanie wyprowadzanego tekstu:
Console.WriteLine(Liczba {0:F2} z dwiema cyframi po
przecinku, 12.34556");

Formaty:
C format walutowy
D notacja dziesitna, pozwala okreli liczb wywietlanych cyfr
E notacja wykadnicza
F notacja zmiennoprzecinkowa z ustalon liczb miejsc po przecinku
N format liczbowy okrelony w Ustawieniach regionalnych
X format szesnastkowy

Program w C#
Aplikacja w C# to zbir klas, struktur, interfejsw i wylicze
Podstawowe elementy programu to klasy, zasady ich budowy bardzo
podobne do C++ i Javy
Punktem startowym aplikacji jest statyczna metoda Main()
Klasa skada si z pl, metod i waciwoci, oznakowanych
modyfikatorami dostpu znanymi z innych jzykw
Aplikacja w C# moe skada si z wielu plikw
Klasa w C# moe by podzielona na wiele plikw, jeden plik moe
zawiera wiele klas
Nazwa pliku nie musi by taka sama jak nazwa klasy

Przestrzenie nazw
Klasy .NET Framework Class Library s pogrupowane w przestrzenie
nazw (namespaces)
Namespace dla naszej aplikacji tworzymy umieszczajc odpowiednie
klasy w blokach namespace Nazwa { }
Odwoania do klasy:
z podaniem penej cieki w przestrzeni nazw:
System.Console.WriteLine();
uycie using w nagwku pliku:
using System;

Console.WriteLine();

Wbudowane typy danych

Podzia typw danych


Typy bezporednie
Wyliczenia i struktury
Zmienne danego typu umieszczane na stosie
Bezporednio zawieraj swoje dane
Kada ma wasn kopi swoich danych
Operacje na jednej nie maj wpywu na drug

Typy referencyjne
Obiekty umieszczane na stercie
Zmienne zawieraj referencje do swoich danych (do obiektu)
Dwie zmienne mog odnosi si do tego samego obiektu
Operacje na jednej zmiennej mog mie wpyw na drug

Typy C# a typy CLS


Typ C#

Rozmiar

Typ CLS

bool
byte
sbyte
short
ushort
char
int
uint
float
double
long
ulong
decimal
object
string

1
1
1
2
2
2
4
4
4
8
8
8
16
4
4

System.Boolean
System.Byte
System.SByte
System.Int16
System.UInt16
System.Char
System.Int32
System.UInt32
System.Single
System.Double
System.Int64
System.UInt64
System.Decimal
System.Object
System.String

Uwagi na temat typw bezporednich


Zmienne tworzymy w standardowy sposb:
int a = 18;
Przed pierwszym uyciem zmiennej trzeba jej przypisa warto (nie
dotyczy to pl klasy, ktrym s automatycznie inicjowane)
Deklaracje staych poprzedzamy sowem kluczowym const,
readonly zmienna, ktrej tylko raz mona przypisa warto
Konwersje do liczbowych typw pojemniejszych dokonuj si
automatycznie, w pozostaych przypadkach naley uy operatora
rzutowania
int i =10;

short s =(int)x;

Brak niejawnej konwersji do typu logicznego jak w C


int i = 1;

if (i) {}

if (i = 2) {}

//BD
//BD

Klasa Object
W C# wszystko (a nie tylko prawie wszystko) jest obiektem
Niektre metody klasy Object:
Equals()

GetType()

ToString()

MemberwiseClone()

Wszystkie typy (w tym typy bezporednie) wywodz si z Object,


posiadaj ponadto wiele wasnych metod, poprawne s zatem konstrukcje:
int x = int.ParseInt(12);
25.ToString();
Istnieje mechanizm automatycznego opakowywania wartoci skalarnych
do obiektw
int x =14; object o = x;

//OK

Operatory uporzdkowane wzgldem priorytetu


()
. ->
[]
++ -new
typeof, sizeof
!~
*
&
(typ)
*/ %
+>> <<
> < >= <=
is
as
== !=
| & ^
|| &&
?:
= *= += -= %= &= ...

grupowanie lub wywoania metody


operatory dostpu do skadowych
operator indeksowania
operatory inkrementacji i dekrementacji
tworzenie nowego obiektu w pamici
typ obiektu, rozmiar
negacja logiczna ( ! ) lub bitowa ( ~ )
operator dereferencji
operator pobrania adresu
operator rzutowania typu
operatory mnoenia, dzielenia oraz modulo
operatory dodawania i odejmowania
przesunicie bitowe w prawo lub w lewo
operatory relacji
operator zgodnoci typw
operator rzutowania w d hierarchii klas
operatory rwnoci i nierwnoci
operatory logiczne bitowe.
operatory logicznej alternatywy oraz koniunkcji
trjargumentowy operator warunku
operatory przypisania

Uwagi do operatorw
Gdy operatory maj ten sam priorytet o ich kolejnoci decyduje czno
Operatory przypisa oraz jednoargumentowe cz od prawej strony,
natomiast operatory dwuargumentowe (z wyjtkiem przypisa) od lewej
Ponadto istniej operatory checked i unchecked suce do sprawdzania
przepenienia, np.
int a = checked( b * c ) ;

Instrukcje warunkowe
if ( Boolean-expression )
first-statement
else
second-statement
switch ( expression )
{
case value1:
instr; break;
case value2:
instr; break;

default:
instr; break;
}

Ptle
while (Boolean-expression )
{ blok instrukcji }
do
{ blok instrukcji }
while (Boolean-expression )
for (int i=0;i<10;i++)
{ blok instrukcji }
ArrayList<int> numbers = new ArrayList <int>();
foreach (int number in numbers)
Console.WriteLine(number);

Instrukcje skoku
goto skok do wybranego miejsca oznaczonego etykiet
break wyjcie z ptli
continue natychmiastowe rozpoczcie kolejnego kroku ptli
return zwrcenie wyniku przez metod i jej zakoczenie

Preprocesor
Dyrektywy w C# podobnie jak w C pozwalaj na preprocessing
W porwnaniu do C preprocesor C# ma mniejsze moliwoci, nie
obsuguje makr
Zestaw dyrektyw obejmuje
#define #undef #if #else #elif #endif
#pragma #warning #error #line #region
Dyrektywa #region pozwala narzdziom takim jak Visual Studio na
ukrywanie kodu w edytorze

Wyliczenia
Bardzo proste typy definiujce zbir moliwych wartoci
Wartoci s synonimami dla wartoci cakowitych
Definicja:
enum Color { Red, Green, Blue };
Uycie:
Color myBest = Color.Green;

Tworzenie klasy
class BankAccount
{
private decimal _balance;
private string _name;
public BankAccount(string name)
{ _name = name; }

//pola klasy
//konstruktor

public void Withdraw(decimal amount)


{ ... }
public void Deposit(decimal amount)
{ ... }
public string Name {
get { return _name; }
set { _name = value; } }
}

//metod

//waciwoc

Modyfikatory dostpu
public : skadowa lub typ zadeklarowany jako publiczny s dostpne z
dowolnego miejsca. Ten rodzaj dostpu jest domylny dla interfejsw
private : skadowa zadeklarowana jako prywatna jest dostpna tylko z
wntrza typu, w ktrym zostaa zadeklarowana. Ten rodzaj dostpu jest
domylny dla skadowych klas i struktur
protected : skadowa zadeklarowana jako chroniona jest dostpna z
wntrza klasy, w ktrej zostaa zadeklarowana lub z wntrza klasy
pochodnej
internal : typ lub skadowa typu s dostpne tylko z wntrza pakietu, w
ktrym nastpia ich deklaracja
protected internal : skadowa zadeklarowana z takim rodzajem dostpu
jest widoczna z wntrza klasy, w ktrej zostaa zadeklarowana (lub klasy
pochodnej od niej) oraz z wntrza pakietu, w ktrym si znajduje

Metody
Metody mog by statyczne tj. wykonywane na rzecz klasy, w C# w
przeciwiestwie do Javy nie mona wywoa statycznej metody na obiekcie
Klasa moe posiada przecione metody o tej samej nazwie, rnice
si sygnatur (na sygnatur nie maj wpywu nazwy parametrw a tylko ich
typy, ani typ zwracany przez procedur)
Argumenty procedury mog by przekazywane przez warto, przez
referencj lub jako parametry wyjciowe:
public static void DoSomething(string param1,
ref string param2, out string param3);

Waciwoci (properties)
Popularny sposb enkapsulacji w C#, waciwoci zapewniaj podobny
dostp jak pola
get dostp do odczytu
set dostp do zapisu
Waciwoci to logiczne pola warto zwracana przez accessor get
moe by obliczana
Properties to nie wartoci; nie maj adresu
Properties nie mog by uyte jako parametry ref lub out metod
Semantycznie s podobne do metod, mog by virtual, abstract lub
override, ale nie mog by typu void ani posiada parametrw

Tworzenie obiektu
Kada klasa posiada metod tworzc nowy egzemplarz klasy
konstruktor. Nazwa konstruktora jest taka sama jak nazwa klasy.
Klasa moe posiada wiele konstruktorw rnicych si typem i liczb
parametrw. Brak konstruktora w definicji klasy powoduje utworzenie przez
kompilator domylnego bezparametrowego konstruktora
Jeeli napiszesz swj wasny konstruktor, kompilator nie stworzy
konstruktora domylnego
Tworzenie obiektu operator new zwraca referencj do obiektu
utworzonego przez konstruktor
BankAccount yours = new BankAccount( Kowalski );

Zmienne referencyjne
Do obiektw odwoujemy si zawsze przez referencje
Wiele referencji moe wskazywa na ten sam obiekt, po utracie ostatniej
referencji obiekt zostanie po pewnym czasie skasowany przez GC
W przypadku zmiennych referencyjnych operatory dziaaj na
referencjach a nie wartociach obiektw
Aby porwna zawarto obiektw zamiast == naley uy metody
Equals()
Tworzenie pytkiej kopii metoda MemberwiseClone()
Gdy w skad naszego obiektu wchodz inne zmienne referencyjne dla
prawidowego dziaania tych i innych metod klasy Object, musimy je
najczciej w naszej klasie przedefiniowa

Operator as
Dziaa dla typw referencyjnych jak rzutowanie
W przypadku bdu
zwraca null
nie wyrzuca wyjtku
Bird b = a as Bird; // Convert
if (b == null)
Console.WriteLine("Not a bird");

Operator is
Zwraca true, jeeli mona wykona konwersj
Bird b;
if (a is Bird)
b = (Bird) a; // Safe
else
Console.WriteLine("Not a Bird");

Operator this
this odwouje si do obiektu, na ktrym wywoano metod
class BankAccount
{
...
public void SetName(string name)
{
this._name = name;
}
private string _name;
}

Statyczne klasy i konstruktory


Oznaczenie klasy jako statyczn zabrania tworzenia obiektw tej klasy
Klasy statyczne nie mog zawiera niestatycznych skadnikw ani
konstruktora
Konstruktor statyczny moe zosta umieszczony w dowolnej klasie,
zostanie wywoany przed wywoaniem waciwego konstruktora
Konstruktor statyczny nie moe posiada modyfikatorw dostpu

Destruktory
Destruktor to metoda, ktra zostanie wywoana tu przed usuniciem
obiektu z pamici
Sam destruktor nie zajmuje si zwalnianiem pamici, ale moe np.
zamkn otwarte pliki
O momencie wywoania destruktora decyduje Garbage Collector
Definicja destruktora:
~NazwaKlasy { }
Brak modyfikatorw dostpu

Wczeniejsze zwalnianie zasobw


Moemy zada wczeniejszego zwolnienia zasobw implementujc
interfejs IDisposable umieci w klasie definicj metody Dispose()
Naley wtedy wyczy mechanizm automatycznego odzyskiwania
pamici metod GC.SuppressFinalize(this) w ciele metody Dispose()
Instrukcja using automatyczne wywoanie Dispose() po bloku instrukcji

using ( Font f = new Font(Arial) )


{

}
//tu wykona si f.Dispose()

Dziedziczenie w C#
Skadnia:
class KlasaOgolniejsza
{
...
}
class KlasaSzegolowa: KlasaOgolniejsza
{
...
}
Klasa dziedziczca nie moe by bardziej dostpna ni podstawowa
Brak wielodziedziczenia, rozwizanie: interfejsy

Dziedziczenie a konstruktory
W deklaracji konstruktora z parametrami musi by uyte sowo base
class Token
{
protected Token(string name) { ... }
...
}
class CommentToken: Token
{
public CommentToken(string name) : base(name) { }
...
}

Metody wirtualne
Metody wirtualne s polimorficzne
Skadnia:
class Token
{
...
public virtual string Name( ) { ... }
}
class CommentToken: Token
{
...
public override string Name( ) { ... }
}

Zasady nadpisywania
Trzeba dopasowa metod nadpisan do jej metody wirtualnej
Mona nadpisa nadpisan metod
Nie wolno deklarowa metody override jako virtual
Nie wolno deklarowa metody override jako static lub private
class Token
{
...
public int LineNumber( ) { ... }
public virtual string Name( ) { ... }
}
class CommentToken: Token
{
...
public override int LineNumber( ) { ... }
public override string Name( ) { ... }
private override string Name( ) { ... }
public override string Name(int k) { ... }
}

//BLAD
//OK
//BLAD
//BLAD

new do ukrywania metod


Do unikania kolizji nazw
Skadnia:
class Token
{
...
public int LineNumber( )
}

{ ... }

class CommentToken: Token


{
...
new public int LineNumber( )
}

{ ... }

Zagadka
Co wywietli program?
class A {
public virtual void M() { Console.Write("A"); }
}
class B: A {
public override void M() { Console.Write("B"); }
}
class C: B {
new public virtual void M() { Console.Write("C"); }
}
class D: C {
public override void M() { Console.Write("D"); }
static void Main() {
D d = new D(); C c = d; B b = c; A a = b;
d.M(); c.M(); b.M(); a.M();
}
}

Metody abstrakcyjne
Sygnatura metody poprzedzona sowem abstract
Metody abstrakcyjne nie posiadaj ciaa
Tylko klasy abstrakcyjne mog deklarowa abstrakcyjne metody
Metody abstrakcyjne s wirtualne
Metody nadpisane mog nadpisywa metody abstrakcyjne na kolejnych
poziomach dziedziczenia

Klasy abstrakcyjne i zamknite


Jeeli klas oznaczymy modyfikatorem abstract nie bdzie moliwe
tworzenie obiektw tej klasy
Klasy abstrakcyjne mog zawiera metod zwyke lub abstrakcyjne
Klasy zamknite (sealed) uniemoliwiaj dziedziczenia
Wiele klas .NET Framework jest sealed: String, StringBuilder itd.

Interfejsy
Interfejs to klasa, ktra zawiera tylko deklaracje metod
Metody nie posiadaj modyfikatorw dostpu, nie maj ciaa
Klasa moe implementowa wiele interfejsw
Konwencja: nazwa rozpoczyna si od I
Przykad:
interface IToken
{
int LineNumber( );
string Name( );
}
class Token: IToken
{
int LineNumber( ) { cialo_metody }
... }

Klasy abstrakcyjne a interfejsy


Podobiestwa
Nie mog mie instancji
Nie mog by sealed

Rnice
Interfejsy nie mog zawiera implementacji
Interfejsy nie mog mie skadowych niepublicznych
Interfejsy nie mog rozszerza nie-interfejsw

Struktury
Typy bardzo podobne do klas, mog zawiera pola, metody, waciwoci,
konstruktory, tworzone za pomoc new
Zmienne tych typw s bezporednie a nie referencyjne, zalecany w
przypadku maych typw
Nie umoliwiaj dziedziczenia, nie mog zawiera bezparametrowych
konstruktorw (jeli konstruktora brak nastpi inicjalizacja wszystkich pl
wartociami domylnymi)
struct Point {
int x, y;
public Point(x, y) {
this.x=x;
this.y=y;
}
}

Obsuga wyjtkw
Znana konstrukcja try catch finally
try
{
Console.WriteLine(Podaj pierwsz liczb");
int i = int.Parse(Console.ReadLine());
Console.WriteLine(Podaj drug liczb");
int j = int.Parse(Console.ReadLine());
int k = i / j;
} catch (OverflowException caught)
{Console.WriteLine(caught.Message);}
catch (DivideByZeroException caught.Message)
{Console.WriteLine(caught.Message);}
catch (Exception caught.Message)
{Console.WriteLine(caught.Message);}
finally
{
Console.WriteLine(Ten kod wykona si zawsze);
Console.ReadLine();
}

Wyrzucanie wyjtkw
Uytkownik moe wyrzuci wyjtek za pomoc instrukcji:
throw new <klasa wyjtku>
throw new OutOfMemoryException();
Uytkownik moe zdefiniowa swj wasny wyjtek. Klasa wyjtku musi
dziedziczy w sposb bezporedni lub poredni z klasy System.Exception
Brak sowa kluczowego throws do umieszczenia w sygnaturze metody

Tablice
Kady typ tablicowy jest typem referencyjnym wywodzcym si z
System.Array
Tworzenie prostych tablic
int[] tablInt = new int[ 100 ] ;
int[ ] tabl = { 1, 2 , 3 } ;

Tworzenie tablic typw referencyjnych wymaga inicjalizacji wartoci tablicy


Moliwe jest tworzenie tablic wielowymiarowych oraz nieregularnych
int [,] tabl3D = new int[5,10]; //Regularna tablica
int [][] tabl2D = new int[10][] ; //Tablica nieregularna

Metody dostpne dla tablic


Rank zwraca ilo wymiarw tablicy
Length zwraca ilo pl tablicy
GetLenght() zwraca liczb pl danego wymiaru
Sort() sortuje tablice
BinarySearch() szybkie wyszukiwanie w posortowanych tablicach
Clear() ustawia wartoci elementw tablicy na zero lub null
Clone() klonuje dan tablice
IndexOf() zwraca indeks pierwszego wystpienia danej wartoci w
tablicy

Tablice argumentw
Sowo kluczowe params pozwala przekaza do metody dowoln liczb
argumentw bez koniecznoci jawnego tworzenia tablicy

public void DisplayParams(params int[] vals)


{
foreach (int i in vals)
Console.WriteLine(i);
}
...
DisplayParams(1,2,3,4,5);

Mechanizm indeksowania
Pozwala na dostp do obiektu tak, jakby by on tablic
Przypumy, e stworzylimy graficzn kontrolk MyComboBox,
przechowujc tablice stringw:
class MyComboBox
{
private string[] strings;
...
public string this[int index]
{
get { return strings[index]; }
set { strings[index] = value; }
}
...
MyComboBox box = new MyComboBox();
...
string s = box[2];

// OBSLUZYC
// WYJATKI!

Kolekcje
C# i .NET Framework dostarczaj wielu standardowych kolekcji:
List<T>
Queue<T>
Stack<T>
Dictonary<T,K>
typ T kolekcji moe by dowolnym typem referencyjnym lub bezporednim
po kolekcjach moemy w wygodny sposb iterowa instrukcj foreach
lub skorzysta z enumeratorw

Interfejsy kolekcji
Moemy tworzy wasne typy kolekcji implementujc w naszej klasie
interfejsy kolekcji:
ICollection<T> IEnumerable<T> IComparable<T>
IList<T> IDictonary<T>
class IterowanaKlasa :IEnumerable<int>
{
private int[] tab = new int[10];
public IEnumerator<int> GetEnumerator()
{
foreach (int i in tab)
yield return i;
}
}
...
IterowanaKlasa klasa = new IterowanaKlasa();
foreach (int i in klasa)
Console.WriteLine(i);

acuchy znakw
acuchami nazywamy literay znakowe umieszczone w cudzysowach
oraz obiekty klasy string
W zapisie literaw moemy uywa znanych z C sekwencji sterujcych
Znak @ przed acuchem powoduje traktowanie dosowne wszystkich
znakw
Obiekty klasy string s niezmienne
Klasa string oferuje wiele uytecznych metod narzdziowych:
Compare() Concat() Join() CompareTo() Insert()
LastIndexOf() Remove() Split() Substring()
ToCharArray() ToLower() ToUpper() Trim()

Manipulowanie acuchami
Operatory (np. +=) i metody manipulujce acuchami zwracaj zawsze
nowy acuch, gdy obiekty string s niezmienne
Tworzenie obiektw jest czasochonne, wic jeli chcemy czsto
manipulowa acuchem dobrze jest uy klasy StringBuilder, oferujcej
metody: Append(), AppendFormat(), Insert(), Remove(), Replace()
String ala = Ala ma kota;
StringBuilder builder = new StringBuilder();
foreach (string s in ala.Split( ))
builder.AppendFormat(Wyraz: {0}\n, s);
Console.WriteLine(builder.ToString());

Wyraenia regularne
C# obsuguje wyraenia regularne o skadni regexp z Perla 5
Podstawow klas do obsugi wyrae regularnych jest Regex
Prosty przykad:
String ciag = "gk4435g52hjvj4hv";
Regex reg = new Regex("[0-9]+");
MatchCollection maches = reg.Matches(ciag);
foreach (Match mach in maches)
Console.WriteLine(mach.ToString());
if (reg.IsMatch("15454621"))
Console.WriteLine("Goal");

A to jeszcze nie koniec


Atrybuty
Przecianie operatorw
Nullable types
Wtki i mechanizmy synchronizacji
Domeny aplikacji
Refleksja typw
Delegaty i zdarzenia
Wskaniki i praca z kodem niezarzdzanym

You might also like