Professional Documents
Culture Documents
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++
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!");
}
}
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();
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
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
short s =(int)x;
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()
//OK
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
//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;
}
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
}
//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
{ ... }
{ ... }
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
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 }
... }
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 } ;
Tablice argumentw
Sowo kluczowe params pozwala przekaza do metody dowoln liczb
argumentw bez koniecznoci jawnego tworzenia tablicy
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");