Professional Documents
Culture Documents
Auditorne CS
Auditorne CS
2008/2009
Auditorne vježbe
.ET i C#
Literatura
C#
• H.Mössenböck: C# to the Point. Addison-Wesley, 2004
• Hejlsberg, Wiltamuth, Golde: The C# Programming Language, Addison-Wesley, 2004
• B.Albahari, P.Drayton, B.Merrill: C# Essentials. O'Reilly, 2001
• Microsoft: C# Language Specification. Microsoft Press, 2001
• S.Robinson et al: Professional C#, Wrox Press, 2001
.ET
• Mössenböck, Beer, Birngruber, Wöß:.ET Application Development. Addison-W., 2002
• J.Gough: Compiling for the .ET Common Language Runtime. Prentice Hall, 2002
• J. Richter: Applied Microsoft .ET Framework Programming. Microsoft Press, 2002
Web Sites
• www.microsoft.com/net/
• msdn.microsoft.com/net/
• www.gotdotnet.com
• www.devhood.com
• www.asp.net
• dotnet.jku.at
Referentne informacije i priručnici za .NET SDK
Überblick 1
Osobine C#
Vrlo sličan Javi
70% Java, 10% C++, 5% Visual Basic, 15% novo
ove osobine u C#
Überblick 2
"Hello World" Program
File Hello.cs
using System;
• importuje prostor imena System
class Hello {
• početna tačka se mora zvati Main
static void Main() {
• ispis na konzolu
Console.WriteLine("Hello World");
}
• naziv fajla i klase ne moraju biti
identični.
}
Struktura C# programa
Program
Überblick 3
Program koji se sastoji od 2 fajla
Counter.cs
class Counter { Kompajliranje
int val = 0;
public void Add (int x) { val = val + x; } csc /target:exe Counter.cs Prog.cs
public int Val () { return val; }
}
Izvršavanje
Prog
Prog.cs
using System;
class Prog {
C#
Simboli
Überblick 4
Identifikatori
Sintaksa
Identifikator = (slovo | '_' | '@' ) { slovo | cifra | '_'}.
Unicode!
• Case-sensitive
• "@" se može koristiti za upotrebu ključnih riječi kao identifikatora
- if ... ključna riječ
- @if ... identifikator if
• Mogu sadržavati Unicode escape sekvence (npr. \u03c0 za π)
Primjeri
nekoIme
suma_od3
_10posto
@while identifikator while
π identifikator π
\u03c0 identifikator π
b\u0061ck identifikator back
9
Ključne riječi
abstract as base bool break
byte case catch char checked
class const continue decimal default
delegate do double else enum
event explicit extern false finally
fixed float for foreach goto
if implicit in int interface
internal is lock long namespace
new null object operator out
override params private protected public
readonly ref return sbyte sealed
short sizeof stackalloc static string
struct switch this throw true
try typeof uint ulong unchecked
unsafe ushort using virtual void
volatile while
77 ključnih riječi u C# (Java ima 47 ključnih riječi)
10
Überblick 5
Konvencije dodjele imena
Veličina slova
• Riječi počinju velikim slovima (npr. PrikaziDijalog)
• Prvo slovo veliko, osim za privatne ili lokalne varijable, konstante i polja
konstante velika slova SIZE, MAX_VALUE
lokalne varijable mala slova i, top, sum
privatna polja mala slova data, lastElement
javna polja velika slova Width, BufferLength
osobine velika slova Length, Fullame
konstante enum.a velika slova Red, Blue
metode velika slova Add, IndexOf
tipovi velika slova StringBuilder (predef. tipovi malim slovima: int)
prostori imena velika slova System, Collections
Prva riječ
• Imena void metoda bi trebala početi glagolom (npr. GetHashCode)
• Ostala imena bi trebala početi imenicom (npr. size, IndexOf, Collections)
• Konstante enumeracije ili bool članovi mogu početi pridjevom (Red, Empty)
11
Tip
bez sufiksa: najmanji tip od int, uint, long, ulong
sufiks u, U: najmanji tip od uint, ulong
sufiks l, L: najmanji tip od long, ulong
Primjeri
17 int
9876543210 long
17L long
17u uint
0x3f int
0x10000 long
0x3fL long
12
Überblick 6
Brojevi sa pokrentim zarezom
Sintaksa (pojednostavljeno)
RealKonstanta = [Cifre] ["." [Cifre]] [Exp] [RealSufiks].
mora imati berem 1 cifru i jedno od ".", Exp, drugi RealSufiks
Cifre = cifra {cifra}.
Exp = ("e" | "E") ["+" | "-"] Cifre.
RealSufiks = "f" | "F" | "d" | "D" | "m" | "M".
Tip
bez sufiksa: double
sufiks f, F: float
sufiks d, D: double
sufiks m, M: decimal
Primjeri
3.14 double
1E-2 double
.1 double
10f float
13
Überblick 7
Karakter konstante i stringovi (nastavak)
Primjeri za escape sekvence u stringovima
"file \"C:\\sample.txt\"" file "C:\sample.txt"
"file \x0022C:\u005csample.txt\x0022"
Primjer
@"file file
""C:\sample.txt""" "C:\sample.txt"
15
Komentari
Jedno-linijski komentari
// komentar
Ograđeni komentari
/* komentar */
ne smije biti ugniježden
Dokumentacioni komentari
/// dokumentacioni komentar
16
Überblick 8
C#
Tipovi
17
Tipovi
18
Überblick 9
Vrijednosni i Referentni Tipovi
Vrijednosni Tipovi Referentni Tipovi
varijabla sadrži vrijednost referencu
smještena na stack heap
inicijalizacija 0, false, '\0' null
dodjela kopira vrijednost kopira referencu
i 17 s
Hello
j 17 s1
19
Primitivni Tipovi
dugi oblik u Javi opseg
sbyte System.SByte byte -128 .. 127
byte System.Byte --- 0 .. 255
short System.Int16 short -32768 .. 32767
ushort System.UInt16 --- 0 .. 65535
int System.Int32 int -231 .. 231-1
uint System.UInt32 --- 0 .. 232 -1
long System.Int64 long -263 .. 263-1
ulong System.UInt64 --- 0 .. 264-1
float System.Single float ±1.5E-45 .. ±3.4E38 (32 Bit)
double System.Double double ±5E-324 .. ±1.7E308 (64 Bit)
decimal System.Decimal --- ±1E-28 .. ±7.9E28 (128 Bit)
bool System.Boolean boolean true, false
char System.Char char Unicode character
20
Überblick 10
Tip decimal
Za kalkulacije sa
• velikim brojevima
• visokom decimalnom tačnošću (npr. 0.1 = 1 * 10 -1)
21
char
22
Überblick 11
Enumeratori
Upotreba
23
Operacije sa Enumeratorima
Validne operacije
poređenja if (c == Color.Red) ...
if (c > Color.Red && c <= Color.Green) ...
+, - c = c + 2;
++, -- c++;
& if ((c & Color.Red) == 0) ...
| c = c | Color.Blue;
~ c = ~ Color.Red;
Napomena
- Enumeratori ne mogu biti dodijeljeni varijabli tipa int (osim nakon type cast).
- Enumerator tipovi naslijeđuju od object (Equals, ToString, ...).
- Klasa System.Enum obezbjeđuje operacije nad enumeratorima
(Getame, Format, GetValues, ...).
24
Überblick 12
izovi (Arrays)
Jedno-dimenzionalni nizovi
int[] a = new int[3];
int[] b = new int[] {3, 4, 5};
int[] c = {3, 4, 5};
SomeClass[] d = new SomeClass[10]; // niz referenci
SomeStruct[] e = new SomeStruct[10]; // niz vrijednosti (direktno u nizu)
25
Multidimenzionalni nizovi
int x = a[0][1];
26
Überblick 13
Ostale osobine nizova
Indeksi počinju od 0
Dužina niza
int[] a = new int[3];
Console.WriteLine(a.Length); // 3
int[][] b = new int[3][];
b[0] = new int[4];
Console.WriteLine("{0}, {1}", b.Length, b[0].Length); // 3, 4
int[,] c = new int[3, 4];
Console.WriteLine(c.Length); // 12
Console.WriteLine("{0}, {1}", c.GetLength(0), c.GetLength(1)); // 3, 4
27
Klasa System.String
Može se koristiti kao standardni tip string
string s = "Fata";
apomene
• Stringovi su nepromjenljivi (koristite StringBuilder ako želite modifikoti stringove)
• Mogu se spajati sa +: "Haso " + s
• Mogu se indeksirati: s[i]
• Dužina stringa: s.Length
• Stringovi su referentni tipovi => referentna semantika dodjeljivanja
• ali se njihove vrijednosti mogu komparirati pomoću == i != : if (s == "Fata") ...
• Klasa String definiše puno korisnih operacija:
CompareTo, IndexOf, StartsWith, Substring, ...
28
Überblick 14
izovi varijabilne dužine
using System;
using System.Collections;
class Test {
static void Main() {
ArrayList a = new ArrayList();
a.Add("Fata");
a.Add("Haso");
a.Add("Mujo");
a.Sort();
for (int i = 0; i < a.Count; i++)
Console.WriteLine(a[i]);
}
}
Izlaz
Fata
Haso
Mujo
29
Asocijativni nizovi
using System;
using System.Collections;
class Test {
Izlaz
Fata = 7131
Mara = 7130
Haso = 7132
30
Überblick 15
Strukture
Deklaracija
struct Point {
public int x, y; // polja
public Point (int x, int y) { this.x = x; this.y = y; } // konstruktor
public void MoveTo (int a, int b) { x = a; y = b; } // metode
}
Upotreba
Point p; // još nije inicijalizirana
Point p = new Point(3, 4); // konstruktor inicijalizira objekt na stack-u
p.x = 1; p.y = 2; // pristup polju
p.MoveTo(10, 20); // poziv metode
Point q = p; // vrijednosna dodjela objekta (sva polja su dodijeljena)
apomane
• Strukture su vrijednosni tipovi!
Deklaracija strukture alocira objekt direktno na stack-u ili unutar nekog drugog objekta.
• Strukture ne smiju deklarisati konstruktor bez parametara (imaju jedan podrazumijevano).
Ipak, mogu ga koristiti: p = new Point(); // inicijalizira polja na 0, null, false, ...
31
Klase
Deklaracija
class Rectangle {
Point origin;
public int width, height;
public Rectangle() { origin = new Point(0,0); width = height = 0; }
public Rectangle (Point p, int w, int h) { origin = p; width = w; height = h; }
public void MoveTo (Point p) { origin = p; }
}
Upotreba
Rectangle r = new Rectangle(new Point(10, 20), 5, 5);
int area = r.width * r.height;
r.MoveTo(new Point(3, 3));
Rectangle r1 = r ; // dodjela reference
apomene
• Klase su referentni tipovi;
Njihovi objekti se alociraju na heap-u.
• Operator "new" alocira objekt i poziva njegov konstruktor.
Klase mogu deklarisati konstruktor bez parametara.
32
Überblick 16
Razlike između klasa i struktura
Klase Strukture
33
Klasa System.Object
Bazna klasa svih referentnih tipova
class Object {
public virtual bool Equals(object o) {...}
public virtual string ToString() {...}
public virtual int GetHashCode() {...}
...
}
Kampitiblnost dodjeljivanja
obj = new Rectangle();
obj = new int[3];
Überblick 17
C#
Izrazi
35
Überblick 18
Aritmetički Izrazi
Operandi moraju biti tipa
- numerički ili char
- operandi za ++ i – moraju biti numerički ili enumerator konstante
(++ i – rade takođe i na float i double!)
Tip rezultata
Najmanji numerički tip koji uključuje oba operand tipa, ali najmanje int.
apomene
- uint => long
- ulong => nedozvoljeno
37
Komparacije
Tipovi operanada
- <, >, <=, >=: numerički, char, enum
- ==, !=: numerički, char, enum, bool, referentni tipovi
- x is T: x: izraz ili proizvoljni tip, T: referentni tip
np.: obj is Rectangle
objOfValueType is IComparable
3 is object
arr is int[]
Tip rezultata
bool
38
Überblick 19
Boolean izrazi (&&, ||, !)
Tip operanada
bool
Tip rezultata
bool
Korisni u
if (p != null && p.val > 0) ...
if (x == 0 || y / x > 2) ...
39
Tip rezultata
- veći od dva operand tipa
- za numeričke tipove i char tip rezultata je barem int
40
Überblick 20
Shift izrazi
Tipovi operanada za x << y i x >> y
- x: integer ili char
- y: int
Tip rtezultata
tip od x, ali barem int
apomena
>> vrši logički shift za unsigned tipove i aritmetički shift za signed tipove
41
Overflow provjere
Overflow se ne provjerava podrazumijevano
int x = 1000000;
x = x * x; // -727379968, nema greške
checked {
...
x = x * x; // System.OverflowException
...
}
42
Überblick 21
typeof i sizeof
typeof
• Vraća Type deskriptor za zadati tipe
(Type deskriptor nekog object o se može dobiti sa o.GetType()).
Type t = typeof(int);
Console.WriteLine(t.Name); // Int32
sizeof
• Vraća velilčinu tipa u bajtima.
• Može se primijeniti samo na vrijednosne tipove.
• Može se koristiti u unsafe bloku (veličina struktura može zavisiti od sistema).
Mora se komapjlirati sa csc /unsafe xxx.cs
unsafe {
Console.WriteLine(sizeof(int));
Console.WriteLine(sizeof(MyEnumType));
Console.WriteLine(sizeof(MyStructType));
}
43
C#
Deklaracije
44
Überblick 22
Opseg deklaracije
Područje programa kome pripada deklaracija
namespace N {
...
class C {
...
void Foo() {
...
if (...) { Blokovi naredbi nisu deklarativni prostori sami za sebe
... već pripadaju deklarativnom prostoru
} zatvarajućeg bloka metode
}
}
}
45
Pravila
Pravila opsega
- Ni jedno ime se ne može deklrisati više od jednom u istom deklrativnom prostoru na istom
nivou.
- Ipak, može biti deklrisano u unutrašnjem deklarativnom prostoru (osim u ugniježdenim
bloku naredbe)
Pravila vidljivosti
- Ime je vidljivo u cijelom njegovom deklarativnom prostoru (lokalne varijable samo od tačke
njihova deklaracije nadalje). Ovo implicira da se neko ime može upotrijebiti prije njegove
deklaracije (osim za lokalne varijable, koje se moraju deklarisati prije upotrebe)
- Ako se jedno ime ponovo deklariše u nekom unutrašnjem deklarativnom prostoru, ono
sakriva isto ime iz vanjskog deklarativnog prostora.
- Generalno, niti jedno ime nije vidljivo izvan njegovog deklarativnog prostora.
- Vidljivost imena deklarisanih u prostorima imena (namespaces), klasama, strukturama i
interfejsima može se kontrolisati pomožu modifikatora public, private, protected i internal.
- Imanima enumeratorskih konstanti se može pristupiti ako su kvalifikovana pomoću imena
njihovog enumerator tipa.
46
Überblick 23
Prostori imena (amespaces)
Fajl: XXX.cs
namespace A {
... klase ...
... interfejsi ...
... strukture ...
... enumeratori ...
... delegati ...
namespace B { // puno ime: A.B
...
}
}
Fajl: YYY.cs
namespace A {
...
namespace B {...}
}
namespace C {...}
Jednaka imena prostora imena u različlitim fajlovima čine jedan deklarativni prostor.
Ugniježdeni prostori imena čine vlastiti deklarativni prostor.
47
using Util.Figures;
class Test {
Rect r; // bez kvalifikatora (zbog using Util.Figures)
Triangle t;
Util.Color c; // sa kvalifikatorom
}
Überblick 24
Klase, Interfejsi, Strukture
class C { // vrijedi i za strukture
... polja, konstante ...
... metode ...
... konstruktori, destruktori ...
... osobine ...
... indekseri ...
... događaji ...
... preopterećeni operatori ...
... ugniježdeni tipovi (klase, interfejsi, strukture, enumeratori, delegati) ...
}
interface IX {
... metode ...
... osobine ...
... indekseri ...
... događaji ...
}
49
Enumeratori
enum E {
... enumeratorske konstante ...
}
50
Überblick 25
Blokovi naredbi
Vrste blokova
void foo (int x) { // blok metode B1
... lokalne varijable ...
if (...) { B2 // ugniježdeni blok
... lokalne varijable ...
}
for (int i = 0; ...) { B3 // ugniježdeni blok
... local variables ...
}
}
B2 B3
52
Überblick 26
C#
Naredbe
53
Jednostavne naredbe
Prazna naredba
; // ; je terminator, a ne separator
Dodjeljivanje
x = 3 * y + 1;
Poziv metode
string s = "a,b,c";
string[] parts = s.Split(','); // poziv object metod (ne-statičke)
54
Überblick 27
if naredba
if ('0' <= ch && ch <= '9')
val = ch - '0';
else if ('A' <= ch && ch <= 'Z')
val = 10 + ch - 'A';
else {
val = 0;
Console.WriteLine("invalid character " + ch);
}
55
switch naredba
switch (country) {
case "England": case "USA":
language = "English";
break;
case "Germany": case "Austria": case "Switzerland":
language = "German";
break;
case null:
Console.WriteLine("no country specified");
break;
default:
Console.WriteLine("don't know the language of " + country);
break;
}
56
Überblick 28
switch sa Goto
int state = 0;
int ch = Console.Read();
switch (state) {
case 0: if (ch == 'a') { ch = Console.Read(); goto case 1; }
else if (ch == 'c') goto case 2;
else goto default;
case 1: if (ch == 'b') { ch = Console.Read(); goto case 1; }
else if (ch == 'c') goto case 2;
else goto default;
case 2: Console.WriteLine("input valid");
break;
default: Console.WriteLine("illegal character " + ch);
break;
}
57
Petlje
while
while (i < n) {
sum += i;
++;
}
do while
do {
sum += a[i];
i--;
} while (i > 0);
58
Überblick 29
foreach naredba
Za iteraciju preko kolekcija i nizova
string s = "Hello";
foreach (char ch in s) Console.WriteLine(ch);
59
Skokovi
break; Za izlazak iz petlje ili switch naredbe.
Nema break sa labelom kao u Javi (upotrijebiti goto umjesto).
myLab:
...
goto myLab; Skok na labelu myLab.
Restrikcije:
- nema skakanja u neki blokk
- nema skakanja izvan finally bloka try naredbe
60
Überblick 30
return naredba
Izlaz iz void metode
class C {
static int Main() {
...
return errorCode; // Main metoda se može deklarisati kao funkcija;
} // vraćeni error code se može provjeriti
// pomožu system varijable errorlevel
}
61
Izlaz na konzolu
Primjeri
Console.Write(intVal); // preopterećena za sve primitivne tipove
Console.WriteLine(intVal); // za objekte ToString() se poziva automatski
Sintaksa placeholder-a
"{" n ["," sirina] [":" format [preciznost]] "}"
Primjer: {0,10:f2}
62
Überblick 31
Format kodovi za brojeve
d, D decimalni format (cijeli broj sa vodećim nulama) -xxxxx
preciznost = broj cifara
63
Primjeri
int x = 17;
Console.WriteLine("{0}", x); 17
Console.WriteLine("{0,5}", x); 17
Console.WriteLine("{0:d}", x); 17
Console.WriteLine("{0:d5}", x); 00017
Console.WriteLine("{0:x}", x); 11
Console.WriteLine("{0:x4}", x); 0011
64
Überblick 32
String formatiranje
Pomoću ToString za numeričke tipove (int, long, short, ...):
string s;
int i = 12;
s = i.ToString(); // "12"
s = i.ToString("x4"); // "000c"
s = i.ToString("f"); // "12.00"
Lokalno-specifično formatiranje
s = i.ToString("c"); // "$12.00"
s = i.ToString("c", new CultureInfo("en-GB")); // "£12.00"
s = i.ToString("c", new CultureInfo("de-AT")); // " 12.00"
65
class Test {
w.WriteLine("Tabela kvadrata:");
for (int i = 0; i < 10; i++)
w.WriteLine("{0,3}: {1,5}", i, i*i);
w.Close();
}
Nije moguće imati više StreamWriter-a koji rade na istom stream-u u isto vrijeme.
66
Überblick 33
Ulaz sa tastature
int ch = Console.Read();
vraća slijedeći karakter.
ćeka dok korisnik ne pritisne return taster.
npr. unos: "abc" + return taster.
Read vraća: 'a', 'b', 'c', '\r', '\n'.
nakon posljednjeg karaktera (Ctrl-Z + return) Read vraća -1
67
Ulaz iz fajla
using System;
using System.IO;
class Test {
r.Close();
}
Nije moguće imati više StreamReader-a koji rade na istom stream-u u isto vrijeme.
68
Überblick 34
Čitanje parametara komandne linije
using System;
class Test {
69
C#
Klase i Strukture
70
Überblick 35
Sadržaj Klasa i Struktura
class C {
... pojja, konstante ... // za objektno-orijentisano programiranje
... metode ...
... konstruktori, destruktori ...
71
Klase
class Stack {
int[] values;
int top = 0;
public Stack(int size) { ... }
public void Push (int x) {...}
public int Pop() {...}
}
72
Überblick 36
Strukture
struct Point {
int x, y;
public Point(int x, int y) { this.x = x; this.y = y; }
public MoveTo (int x, int y) {...}
}
73
Primjer
public class Stack {
private int[] val; // i podrazumijevano je private
private int top; // i podrazumijevano je private
public Stack() {...}
public void Push(int x) {...}
public int Pop() {...}
}
74
Überblick 37
Pristup private članovima
class B {
private int x;
...
}
class C {
private int x;
public void f (C c) {
x = ...; // metoda može privatnim članovima ove klase (this).
c.x = ...; // metoda klase C može pristupiti privatnim članovima
// nekog drugog objekta C.
B b = ...;
b.x = ...; // greška! metoda klase C ne može pristupiti privatnim članoivima
// neke druge klase.
}
}
75
Polja i konstante
class C {
Überblick 38
Statička polja i konstante
Pripadaju klasi a ne objektu
class Rectangle {
static Color defaultColor; // jedno po klasi
static readonly int scale; // -- " --
int x, y, width,height; // jedno po objektu
...
}
77
Metode
Primjer
class C {
int sum = 0, n = 0;
78
Überblick 39
Statičke metode
Operacije nad podacima klase (statičkim poljima)
class Rectangle {
static Color defaultColor;
79
Parametri
vrijednosni parametri (ulazni parametri) - "poziv po vrijednosti"
void Inc(int x) {x = x + 1;} - formalni parametar je kopija
void f() {
int val = 3; aktuelnog parametra
Inc(val); // val == 3 - aktuelni parametar je neki izraz
}
80
Überblick 40
Varijabilni broj parametara
Posljednjih n parametara može biti sekvenca vrijdnosti određenog tipa.
ključna riječ
array tip
params
Upotreba
Add(out sum, 3, 5, 2, 9); // sum == 19
Drugi primjer
void Console.WriteLine (string format, params object[] arg) {...}
81
Preopterećivanje Metoda
Više metoda neke klase može imati isto ime
- ako imaju razlilčit broj parametara, ili
- ako imaju razlilčte tipove parametara, ili
- ako imaju razlilčite vrste parametara (vriejdnosni, ref/out)
Primjeri
void F (int x) {...}
void F (char x) {...}
void F (int x, long y) {...}
void F (long x, int y) {...}
void F (ref int x) {...}
Pozivi
int i; long n; short s;
F(i); // F(int x)
F('a'); // F(char x)
F(i, n); // F(int x, long y)
F(n, s); // F(long x, int y);
F(i, s); // nejasno između F(int x, long y) i F(long x, int y); => kompilaciona greška
F(i, i); // nejasno između F(int x, long y) iF(long x, int y); => kompilaciona greška
82
Überblick 41
Preopterećivanje Metoda
Preopterećene metode se ne mogu razlikovati samo po svojim funkcijskim tipovima
int F() {...}
string F() {...}
F(); // ako se povratni tip ignoriše, ime F ne može biti razriješeno
Razlozi za ova ograničenja leže u implementaciji: CIL ne sadrži adresu pozvane metode
već njen opis, koje je identično u oba slučaja.
83
Konstruktori za klase
Primjer
class Rectangle {
int x, y, width, height;
public Rectangle (int x, int y, int w, int h) {this.x = x; this.y = y; width = x; height = h; }
public Rectangle (int w, int h) : this(0, 0, w, h) {}
public Rectangle () : this(0, 0, 0, 0) {}
...
}
84
Überblick 42
Podrazumijevani konstruktor
Ako niti jedan konstrukotr nije deklarisan u klasi, kompajler generiše
podrazumijevani konstruktor bez parametara :
class C { int x; }
C c = new C();// ok
podrazumijevani konstruktor inicijalizira sva polja kako slijedi:
numerička 0
enumeratori 0
bool false
char '\0'
reference null
Ako je deklarisan jedan konstruktor, ne generišre se podrazumijevani
konstruktor :
class C {
int x;
public C(int y) { x = y; }
}
85
Konstruktori za strukture
Primjer
struct Complex {
double re, im;
public Complex(double re, double im) { this.re = re; this.im = im; }
public Complex(double re) : this(re, 0) {}
...
}
Complex c0; // c0.re i c0.im nisu inicijlazirani
Complex c1 = new Complex(); // c1.re == 0, c1.im == 0
Complex c2 = new Complex(5); // c2.re == 5, c2.im == 0
Complex c3 = new Complex(10, 3); // c3.re == 10, c3.im == 3
86
Überblick 43
Statički konstruktori
I za klase i za strukture
class Rectangle {
...
static Rectangle() {
Console.WriteLine("Rectangle initialized");
}
}
struct Point {
...
static Point() {
Console.WriteLine("Point initialized");
}
}
• Mora biti bez parametara (takođe za strukture) i ne smije imati public ili private
modifikatore.
• Smije biti samo jedan statički konstruktor po klasi/strukturi.
• Poziva se jednom prije prve upotrebe datog tipa.
• Koristi se za inicijalizaciju statičkih polja.
87
Destruktori
class Test {
~Test() {
... akcije čišćenja ...
}
88
Überblick 44
Osobine
Sintaksni "šlag" za get/set metode
class Data { tip osobine
ime osobine
FileStream s;
89
Osobine (nastavak)
Operatori dodjlejivanja rade i na osobinama
class C {
private static int size;
C.Size = 3;
C.Size += 2; // Size = Size + 2;
90
Überblick 45
Osobine (nastavak)
get ili set se mogu izostaviti
class Account {
long balance;
x = account.Balance; // ok
account.Balance = ...; // pogrešno
91
Preopterećivanje operatora
Statička metoda za implementaciju određenog operatora
struct Fraction {
int x, y;
public Fraction (int x, int y) {this.x = x; this.y = y; }
Upotreba
Fraction a = new Fraction(1, 2);
Fraction b = new Fraction(3, 4);
Fraction c = a + b; // c.x == 10, c.y == 8
92
Überblick 46
Operatori konverzije
Implicitna konverzija
- Ako je uvijek moguća bez gubitka preciznosti
- npr. long = int;
Eksplicitna konverzija
- Ako je neohodna run time provjera ili je moguće skračivanje
- npr. int = (int) long;
Upotreba
Fraction f = 3; // implicitna konverzija, f.x == 3, f.y == 1
int i = (int) f; // eksplicitna konverzija, i == 3
93
Ugniježdeni tipovi
class A {
private int x;
B b;
public void Foo() { b.Bar(); }
...
public class B {
A a;
public void Bar() { a.x = ...; ... a.Foo(); }
...
} }
class C {
A a = new A();
A.B b = new A.B();
}
Za pomoćne klase koje bi trebale biti sakrivene
- Unutrašnja klasa može pristupiti svim članovima vanjske klase (čak i privatnim).
- Vanjska klasa moće pristupiti samo public članovima unutrašnje klase.
- Ostale klase mogu pristupiti unutrapnjoj klasi samo ako je ona public.
Ugniježdeni tipovi mogu takođe biti strukture, enumeratori, interfejsi i delegati.
94
Überblick 47
Razlike prema Javi
• ema anonymous tipova kao u Javi
• Različita podrazumijevana vidljivost za članove
C#: private
Java: package
• Različita podrazumijevana vidljivost za tipove
C#: internal
Java: package
95
C#
Naslijeđivanje
96
Überblick 48
Sintaksa
class A { // bazna klasa
int a;
public A() {...}
public void F() {...}
}
97
Preopterećivanje metoda
Samo metode koje su deklarisane kao virtual mogu biti redefinisane (overridden) u
podklasama
class A {
public void F() {...} // ne može biti redefinisana
public virtual void G() {...} // može biti redefinisana u nekoj podklasi
}
98
Überblick 49
Dinamičko povezivanje - Binding (pojednostavljeno)
class A {
public virtual void WhoAreYou() { Console.WriteLine("Ja sam A"); }
}
class B : A {
public override void WhoAreYou() { Console.WriteLine(" Ja sam B"); }
}
99
Sakrivanje
Članovi mogu biti deklarisani sa new u podklasi.
Oni sakrivaju naslijeđene članove sa istim imenom i potpisom.
class A {
public int x;
public void F() {...}
public virtual void G() {...}
}
class B : A {
public new int x;
public new void F() {...}
public new void G() {...}
}
B b = new B();
b.x = ...; // pristupa B.x
b.F(); ... b.G(); // poziva B.F i B.G
100
Überblick 50
Abstract klase
Primjer
abstract class Stream {
public abstract void Write(char ch);
public void WriteString(string s) { foreach (char ch in s) Write(s); }
}
Napomene
• Abstraktne metode nemaju implementaciju.
• Abstraktne metode su implicitno virtual.
• Ako neka klasa ima abstraktne metode (deklarisane ili naslijeđene) i ona mora biti abstract.
• Ne mogu se kreirati objekti od abstraktne klase.
101
Klasa System.Object
Najviša bazna klasa svih drugih klasa
class Object {
protected object MemberwiseClone() {...}
public Type GetType() {...}
public virtual bool Equals (object o) {...}
public virtual string ToString() {...}
public virtual int GetHashCode() {...}
}
Direktno upotrebljiva:
Type t = x.GetType(); vraća deskriptor tipa (za reflection)
object copy = x.MemberwiseClone(); pravi kopiju (ova metoda je protected!)
102
Überblick 51
C#
Izuzetci (Exceptions)
103
try naredba
FileStream s = null;
try {
s = new FileStream(curName, FileMode.Open);
...
} catch (FileNotFoundException e) {
Console.WriteLine("file {0} not found", e.FileName);
} catch (IOException) {
Console.WriteLine("some IO exception occurred");
} catch {
Console.WriteLine("some unknown error occurred");
} finally {
if (s != null) s.Close();
}
104
Überblick 52
System.Exception
Osobine
e.Message poruka o grešci kao string;
postavljena sa new Exception(msg);
e.StackTrace trag stack-a poziva metode kao string
e.Source aplikacija ili object koji je izbacio exception
e.TargetSite objekt metode koja je izbacila exception
...
Metode
e.ToString() vraća naziv exception-a i StackTrace
...
105
106
Überblick 53
Exception hijerarhija (izvod)
Exception
SystemException
ArithmeticException
DivideByZeroException
OverflowException
...
NullReferenceException
IndexOutOfRangeException
InvalidCastException
...
ApplicationException
... ukorisnički-definisani exception-i
...
IOException
FileNotFoundException
DirectoryNotFoundException
...
WebException
...
107
F G H
... try { ... ...
F(); G(); H(); throw new FooException(...);
... .... .... ....
} catch (Exc e) {
...
}
Prolazi se unazad kroz lanac poziva dok se ne nađe metoda koja hvata dati tip greške.
Ako se ne pronađe => Program se prekida sa ispiok poziva na stack-u (trace)
Prednost: pogodnost
Mana: manje robustan softver
108
Überblick 54
ema throws klauzule u potpisu metode
Java
void myMethod() throws IOException {
... throw new IOException(); ...
}
C#
void myMethod() {
... throw new IOException(); ...
}
109
C#
Prostori imena
110
Überblick 55
Prostori imana (amespaces)
File: XXX.cs
namespace A {
...
namespace B { // puno ime: A.B
...
}
}
File: YYY.cs
File: ZZZ.cs
namespace A { namespace A.B {
... ...
namespace B {...} }
}
namespace C {...}
• Jedan fajl može deklarisati više prostora imena.
• Jedan prostor imena može biti ponovo otvoren u drugom fajlu.
• Za tipove koji nisu deklarisani niti u jednom prostoruimena, se smatra da su u podrazumijevanom
prostoru imena
(global prostor imena).
111
using Util.Figures;
class Test {
Rect r; // bez kvalifikacije (zbog using Util.Figures)
Triangle t;
Util.Color c; // sa kvalifikacijom
}
112
Überblick 56
C# Prostori imena i Java Paketi
C# Java
Jedan fajl može sadržavati višeprostora imena Jedan fajl može sadržavati samo 1 paket
xxx.cs xxx.java
namespace A {...} package A;
namespace B {...} ...
namespace C {...} ...
Samples Samples
xxx.cs A
C.java
113
C# Java
Importovanje prostora imena Importovanje klasa
using System; import java.util.LinkedList;
import java.awt.*;
Überblick 57