Professional Documents
Culture Documents
C# Könyv - Illés Zoltán PDF
C# Könyv - Illés Zoltán PDF
ILLS ZOLTN
Programozs C# nyelven
I. Alapismeretek
Minden jog fenntartva. Ezt a knyvet vagy annak rszleteit a kiad engedlye nlkl brmilyen
formban vagy eszkzzel reproduklni, trolni s kzlni tilos.
A knyv ksztse sorn a kiad s a szerz a legnagyobb gondossggal jrt el. Az esetleges
hibkat s szrevteleket a jos@jos.hu e-mail cmen szvesen fogadjuk.
Bevezet ................................................................................................... 11
I. Alapismeretek ....................................................................................... 13
I.1. A nyelv trtnete............................................................................ 13
I.2. A nyelv jellemzi........................................................................... 13
I.3. A .NET krnyezet ttekintse ........................................................ 15
I.4. A program szerkezete .................................................................... 16
I.5. Parancssori krnyezet hasznlata................................................... 20
I.6. A krnyezet hasznlata .................................................................. 21
I.7. Windows alkalmazsok ksztse .................................................. 25
I.8. Feladatok........................................................................................ 27
II. A C# nyelv alaptpusai ........................................................................ 28
II.1. Vltozk definilsa ..................................................................... 28
II.2. llandk definilsa ..................................................................... 29
II.3. Vltozk inicializlsa.................................................................. 29
II.4. Elemi tpusok................................................................................ 30
II.5. Felsorols tpus ............................................................................. 35
II.6. Feladatok ...................................................................................... 37
III. Kifejezsek, mveletek ...................................................................... 38
III.1. Egyoperandus opertorok.......................................................... 38
III.2. Ktoperandus opertorok .......................................................... 39
III.3. Hromoperandus opertor ......................................................... 42
III.4. Ktoperandus rtkad opertorok............................................ 43
III.5. Feladatok ..................................................................................... 46
IV. sszetett adattpusok.......................................................................... 47
IV.1. Tmbk ....................................................................................... 47
IV.2. Struktra...................................................................................... 51
IV.3. Feladatok..................................................................................... 54
V. Utastsok ............................................................................................ 56
V.1. sszetett utasts .......................................................................... 56
V.2. Kifejezs utasts.......................................................................... 56
V.3. Elgazs utasts........................................................................... 57
V.4. Ciklus utasts............................................................................... 59
V.5. Ugr utastsok............................................................................. 63
V.6. Feladatok ...................................................................................... 67
VI. Fggvnyek........................................................................................ 68
VI.1. A fggvnyek paramtertadsa ................................................. 68
VI.2. A Main fggvny paramterei .................................................... 72
VI.3. Fggvnyek vltoz szm paramterrel.................................... 74
I. Alapismeretek
Bevezet
Valamilyen programot megrni nem nehz, de j programot rni bizony nem
egyszer feladat.
Nehz lenne megmondani, hogy melyik az aranyt, amely a j programkszts iskoljnak tekinthet, de az bizonyosan llthat, hogy j s hatkony
programot csakis megfelel fejlesztsi krnyezetben tudunk kszteni.
Mai rohan vilgunkban a gyors gazdasgi, trsadalmi vltozsok mellett is
szembetl, mennyire gyors, milyen dinamikus a vltozs az informatikban.
Nem telik el gy hnap, hogy az informatika valamelyik terletn be ne
jelentennek valamilyen jdonsgot, legyen az hardver, vagy szoftver.
A szoftver fejlesztsi krnyezeteket tekintve az utbbi idk egyik legnagyobb s legtbb jdonsgot hoz egysgcsomagjt kaptk meg a fejlesztk
az j Microsoft .NET rendszerrel. Ebben a krnyezetben, brmilyen terletre
gondolunk, j technolgik, j lehetsgek segtik a fejlesztk munkjt
(Common Language Runtime (clr), ASP.NET, stb.).
Ismerjk mr: j msorhoz j frfi kell.
Ezt az elvet alkalmazva a mr klasszikusnak tekinthet Basic s C++ nyelvek mellett megjelent az j C# (ejtsd: angolosan sz srp, magyarosan
C kettskereszt, Cisz) programozsi nyelv a .NET rendszer rszeknt.
A nyelv mottjnak taln a kvetkez kpletet tekinthetjk:
A Basic egyszersge + a C++ hatkonysga = C#!
Ebben a knyvben a fejlesztsi eszkztrnak ezt az alapjt, a C# programozsi nyelvet, annak lehetsgeit ismerhetik meg.
Terveim szerint egy kvetkez knyvben a nyelv legfontosabb krnyezetbeli
alkalmazsi lehetsgeit rszletesen trgyalni fogjuk.
Remlem, hogy ez a knyv szles olvastbornak fog hasznos informcikat
nyjtani. A programozssal most ismerkedknek egy j vilg j eszkzt mutatja meg, mg a programozsban jrtas Olvask taln ennek a knyvnek a
segtsgvel megrzik azt, hogy ez az a nyelv, amit kerestek.
Befejezsl remlem, hogy a magyarzatokhoz mellkelt pldaprogramok
jl szolgljk a tanulsi folyamatot, s az anyag szerkesztse folytn nem kerltek bele nemkvnatos elemek.
Vgl, de nem utolssorban meg kell ksznnm felesgemnek e knyv
olvashatsgt segt munkjt.
Ills Zoltn
11
I. Alapismeretek
I. Alapismeretek
I.1. A nyelv trtnete
A C# programozsi nyelv a Microsoft j fejlesztsi krnyezetvel, a
2002-ben megjelent Visual Studio.NET programcsomaggal, annak rszeknt
jelent meg.
Br a nyelv hossz mlttal nem rendelkezik, mindenkppen eldjnek
tekinthetjk a C++ nyelvet, a nyelv szintaktikjt, szerkezeti felptst.
A C, C++ nyelvekben kszlt alkalmazsok elksztshez gyakran hoszszabb fejlesztsi idre volt szksg, mint ms nyelvekben, pldul a MS Visual
Basic esetn. A C, C++ nyelv komplexitsa, a fejlesztsek hosszabb idciklusa
azt eredmnyezte, hogy a C, C++ programozk olyan nyelvet keressenek, amelyik jobb produktivitst eredmnyez, ugyanakkor megtartja a C, C++ hatkonysgt.
Erre a problmra az idelis megolds a C# programozsi nyelv. A C# egy
modern objektumorientlt nyelv, knyelmes s gyors lehetsget biztostva
ahhoz, hogy .NET keretrendszer al alkalmazsokat ksztsnk, legyen az akr
szmols, akr kommunikcis alkalmazs. A C# s a .NET keretrendszer alapja
a Common Language Infrastructure(CLI).
13
I. Alapismeretek
A keretrendszer fordtsi parancsa parancssorbl is egyszeren hasznlhat. (pl. csc /out:alma.exe alma.cs).
Minden utasts helyre sszetett utasts (blokk) rhat. Az sszetett
utastst a kapcsos zrjelek kz {} rt utastsok definiljk.
rtk (alaptpusok, enum, struct, value) illetve referencia (class) tpus
vltozk.
Nincs mutathasznlat; biztonsgos a vektorhasznlat.
Boxing, unboxing. Minden tpus se az object, gy pldul egy egsz tpust (int) csomagolhatunk objektumba (boxing) illetve vissza
(unboxing).
Fggvnyek defincii nem gyazhatk egymsba, nmagt meghvhatja
(rekurzi). Teht fggvnydefinci esetn nincs blokkstruktra. Blokkon bell statikus vagy dinamikus lettartam vltozk deklarlhatk.
Fggvnypolimorfizmus megengedett.
rtk, referencia (ref) s output (out) fggvnyparamterek.
Kezd paramter-rtkads, vltoz paramterszm fggvny deklarlsa.
Delegltak, esemnyek hasznlata.
Hierarchikus nvterekben hasznlt osztlyok. Mivel minden osztly, ezrt
a program, a Main fggvny public static hozzfrs. Tbb osztly is
tartalmazhat Main fggvnyt, de ilyen esetben a fordtskor meg kell
mondani, hogy melyik osztlybeli Main fggvny legyen az aktulis indul (/main:osztlynv).
j opertorok: is opertor egy objektum tpust ellenrzi (x is Labda), as
opertor a bal oldali operandust jobb oldali tpuss konvertlja (Labda
l = x as Labda;). A hagyomnyos konverzis opertortl abban klnbzik, hogy nem generl kivtelt!
Privt konstruktor (nem akarunk egy pldnyt se), statikus konstruktor
(statikus mezk inicializlsa, mindig pldny konstruktor eltt hvdik
meg, futsi idben az osztlybetlt hvja meg) hasznlata.
Nincs destruktor, helyette a keretrendszer szemtgyjtsi algoritmusa van.
Szksg esetn az osztly Dispose metdusa jradefinilhat.
Egyszeres rkls, interface-ek hasznlata.
Opertorok definilsnak lehetsge, property, indexer definils.
Kivtelkezels megvalstsa.
Prhuzamos vgrehajts szlak definilhatsga.
I. Alapismeretek
I. Alapismeretek
Az osztlyknyvtrak hasznlathoz egy fejleszt nyelvre van szksg. A
Visual Studio.NET alaprtelmezsben hrom nyelvet biztost a fejlesztk szmra. A Visual Basic s a Visual C++ nyelveket, mint az eld keretrendszerbl
megmaradt bzisnyelveket, s egy j nyelvet, amit a .NET keretrendszerhez
fejlesztettek ki, a Visual C#-ot. Ma mr a Java utdnyelv, a J# is a Visual
Studio.NET 2003 fejlesztrendszer rsze. Az j C# nyelvet szabvnyostottk,
ami a szleskr elterjedsnek fontos felttele. A C# nyelv szabvnyostott
dokumentcijhoz ECMA-334 kd alatt frhetnk hozz.
A .NET keretrendszer lnyege, hogy a kzs nyelvi defincik mr szabvnyostottak. Ebben a szabvnyostsban a Microsoft mellett az informatikban
rdekelt legnagyobb szervezetek is (HP, Intel, IBM, Sun, Fujitsu, Netscape)
rszt vettek. Ez ECMA-335-s azonostval, mint a kzs nyelvi infrastruktra
vagy eredeti nevn Common Language Infrastucture (CLI) nemzetkzi
szabvnyv vlt.
I. Alapismeretek
Fggvnyek defincijnak formja:
visszaadott_tpus nv(argumentumlista, ha van)
{
vltoz defincik,
deklarcik
s utastsok
}
Az osztlyok egyikben kell egy Main nev fggvnynek szerepelnie, amely
futtatskor az opercis rendszertl a vezrlst megkapja. A nyelv megengedi,
hogy tbb tpusban (osztlyban) is definiljunk ilyen fggvnyt. Ebben az esetben fordtskor kell megmondani, hogy melyik tpus Main fggvnye legyen a
fprogram.
A programban hasznlt neveknek betvel vagy _ jellel kell kezddnik,
majd a msodik karaktertl tetszleges bet s szm kombincija llhat. A
nyelvben a kis- s nagybetk klnbzek, gy pldul a kvetkez kt nv sem
azonos:
alma
aLma
Az azonostnevek hossza ltalban 32 karakter lehet, de sok rendszerben az
ignyeknek megfelelen lehet ezen vltoztatni.
A .NET keretrendszer 16 bites unikd karakterbrzolst hasznl, amiben a
magyar kezetes karakterek is benne vannak. A nyelvi fordt ezeket az kezetes
betket is megengedi, gy az albbi nv is megengedett:
krte
Azonostk hasznlatra nem megengedettek a C#-ban a kvetkez kulcsszavak vagy vdett azonostk:
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
I. Alapismeretek
readonly
short
switch
typeof
ushort
ref
stackalloc
this
uint
using
return
static
throw
ulong
virtual
sbyte
string
true
unchecked
void
sealed
struct
try
unsafe
while
1. bra
I. Alapismeretek
Plda:
/// <summary>
/// ez egy vltoz
/// </summary>
int i;
/// <summary>
/// ez meg egy fggvny
/// </summary>
/// <param name="i"></param>
public void szamol(int i)
{
Programunk rvid magyarzataknt annyit mondhatunk, hogy a forrskdunk a legegyszerbb esetben egyetlen llomnybl ll, amiben nem definilunk
nvteret, hanem csak egy foci osztlyt. (Valamilyen tpust kell definilnunk!)
Ebben az osztlyban egyetlen fggvnyt definilunk, a programot jelent Main
fggvnyt. Mivel egyetlen osztlytpus egyetlen pldnya sem ltezik a ltrehozsig (a definci mg nem ltrehozs!), ezrt ahhoz, hogy a fggvnynk pldny nlkl is ltezzen, a static jelzvel kell a hozzfrsi szintet meghatrozni.
A C stlus nyelvek hagyomnyaknt a C# nyelvnek sem rszei a beolvas s
kir utastsok, gy knyvtri szolgltatsokra kell hagyatkoznunk, ami a
System nvtr rsze, s ennek a nvtrnek a Console osztlya biztostja a klasszikus kpernyre rs, Console.WriteLine() s billentyzetolvass, Console.ReadLine()
feladatt.
I. Alapismeretek
2. bra
A parancssori fordtnak a /? paramterrel trtn futtatsa, mint egy segtsg funkci, megadja a fordt fontosabb kapcsolit.
Ezek kzl a legfontosabbak a kvetkezk:
/t:exe
alaprtelmezs, exe llomnyt fordt.
/t:library
a fordtand llomny knyvtr (dll) lesz.
/out:nv
a fordts eredmnynek nevt hatrozhatjuk meg,
alaprtelmezsben ez a nv megegyezik a fordtott fjl nevvel.
/r:valami.dll
egy knyvtr felhasznlsa fordtskor, ha tbb knyvtri llomnyt kell hozzfordtani, akkor az llomnynevek kz vesszt kell
tenni.
/main:osztlynv a nyelv megengedi, hogy tbb osztly is tartalmazzon
Main fggvnyt, ekkor ezzel a kapcsolval mondhatjuk meg, hogy a sok Main
fggvny kzl melyik legyen a fprogram.
I. Alapismeretek
A keletkezett exe llomnyrl el kell mondani, hogy annak futtatshoz nem
elegend egy hagyomnyos 32 bites Microsoft opercis rendszer, gyakran ezt
gy fogalmazzk meg, hogy a keletkezett program nem natv kdot tartalmaz,
hanem szksges az opercis rendszerhez hozztelepteni a .NET keretrendszert! Ezt termszetesen a Visual Studio.NET installlsa elvgzi, gy a sajt
gpnkn nem tnik fel annak hinya sem. Az irodalom ezt az exe kdot gyakran menedzselt (managed) kdnak nevezi.
ltalban elmondhat, hogy az j fejlesztkrnyezet minden egyes
nyelvi eszkze olyan kdot fordt, aminek szksge van erre a
keretrendszerre. Termszetesen mint az let minden terletn, gy itt is vannak kivtelek. Ilyen kivtel pldul a C++ nyelv, ahol alaprtelmezs szerint
meg kell mondani, hogy a programunkat menedzselt vagy natv kdra
fordtsa-e a fordtnk. Natv kd alatt rtjk azt a fordtott eredmnyt, ami
processzor szint utastsokat tartalmaz. Ebben a fejlesztkrnyezetben ezt a
kdot a menedzselt ellentteknt, nem menedzselt (unmanaged) kdnak is
nevezik.
I. Alapismeretek
3. bra
4. bra
I. Alapismeretek
1. Ki kell vlasztani a programozsi nyelvet.
2. Az adott nyelvhez meg kell mondani, hogy milyen jelleg alkalmazst
szeretnnk kszteni.
3. Meg kell adni a munkaknyvtrat s a projekt nevt.
Ebben a knyvben a nyelvet illeten mindig a Visual C# Project lehetsget
vlasztjuk, amit a nyitott mappajel is mutat.
A Templates ablakban vlaszthatjuk ki az alkalmazs jellegt. Jelen esetben,
illetve a kvetkez rsz pldiban az n. Console Application lehetsget
vlasztjuk, ami egy hagyomnyos karakteres fellet programkrnyezetet jelent.
Ezek az alkalmazsok parancssori ablakban futnak.
A munkaknyvtr s a projekt nevnek megadsa azt jelenti, hogy ltrehozza a munkaknyvtron bell a projekt nvvel megadott knyvtrat, esetnkben a c:\programok\hajra knyvtrat, s ezen bell egy nknyes class1.cs llomnyt, aminek tartalma a kvetkez:
5. bra
I. Alapismeretek
Ezeket, illetve a dokumentcis megjegyzseket figyelembe vve lthat, hogy a
kt kdrszlet azonos.
Amint a 3. brrl lthat, a fejlesztkrnyezet rendelkezik a mr szoksosnak nevezhet berskori rtelmezssel (IntelliSense), s ha ltala ismert tpust
fedez fel, akkor egy helyi ablakban megmutatja az aktulis objektum elrhet
jellemzit.
A projekt a 3. brn lthat forrskd mellett mg egy assemblyinfo.cs llomnyt is tartalmaz, amiben hrom jellemz attribtum belltst vgezhetjk el.
Bellthatjuk programunk jellemz adatait, verziszmt, illetve a digitlis alrs kulcsllomnyra vonatkoz informcit is. Ezek a tulajdonsgok a .NET
keretrendszer szolgltatsain alapulnak, aminek rszletezse meghaladja ennek a
knyvnek a kereteit.
A programot a Debug menpont Start (F5) vagy Start without debugging
(CTRL-F5) menpontjval fordthatjuk le, illetve futtathatjuk. Ez utbbi menpontot hasznlva a parancssori ablak nem tnik el a program futsa utn,
lehetsget biztostva a program eredmnynek megnzsre.
6. bra
I. Alapismeretek
7. bra
Miutn a fenti dialgusablakban befejezzk az adatok megadst, azt lthatjuk, hogy a karakteres alkalmazsokhoz kpest a munkafellet megvltozik,
hiszen ebben a rendszerben az az alapelkpzels, hogy egy res ablak (form) az
indul program.
Ez valjban azt jelenti, hogy egy grafikus tervezablakot kapunk (Form1),
amibe az eszkztrbl (Toolbox) a szksges vezrlelemeket a grafikus felletre visszk, s ekzben a forrskdot (form1.cs) a keretrendszer a felletalaktsnak megfelelen automatikusan mdostja.
I. Alapismeretek
Az els grafikus programunkhoz hrom lpst vgezznk el!
1. rjuk t az ablak fejlcszvegt. Ehhez kattintsunk egyet a form-ra, majd
a jobb als Properties (Tulajdonsgok) ablakban rjuk t a Text tulajdonsgot. (Els program!)
2. A Toolbox ablakbl helyezznk fel egy Button, nyomgomb objektumot. A Tulajdonsg ablakban lltsuk t a Text mezt a Vge szvegre.
3. Kattintsunk kettt a nyomgomb objektumra, ezzel a nyomgomb alaprtelmezett kattints esemny fggvnyt definiltuk. Ebbe rjuk be a
Close(), ablakbezrs utastst. Ekkor a form1.cs forrskd rszlete a
kvetkezkppen nz ki:
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
Close();
}
Ezen hrom lps utn fordtsuk le, majd futtassuk a programot. Ezt, ahogy a
korbbi karakteres program esetben is a Debug men Start menpontjval
tehetjk meg.
Ahhoz, hogy tovbbi grafikus alkalmazsokat tudjunk kszteni, elengedhetetlenl szksges, hogy ismerjk egyrszt a vlasztott nyelv lehetsgeit,
msrszt a rendszer knyvtri szolgltatsait.
Az elbbi, a nyelvi lehetsgek megismerse ltalban a legknnyebb s
leggyorsabb feladat. Ez remnyeim szerint a kvetkez rsz ttanulmnyozsa
utn a kedves Olvasnak is sikerl. Viszont az utbbi, a rendszer knyvtri
szolgltatsainak megismerse hosszabb, tbb idt, sok egyni munkt jelent
feladat. Azt remlem, hogy a befejez, a grafikus alkalmazsok alapjaival foglalkoz rsz utn mindenki elg btorsgot rez magban a tovbbi nll
munka folytatshoz.
I. Alapismeretek
I.8. Feladatok
1. Milyen kd programot fordt a Visual Studio.NET fejlesztkrnyezet?
2. Mit csinl a Garbage Collection (szemtgyjt) algoritmus?
3. Lehet-e kezetes karaktereket hasznlni a C# programban?
4. Mik a Main fggvny jellemzi?
5. Egy program hny Main fggvnyt tartalmazhat, hogy tudjuk
lefordtani?
28
// vals konstans
// !!! HIBA
// egsz konstans
"Teszt");
alma );
//eredmny Test
//eredmny 5
//helyi vltoz
alma ) ;
//eredmny 6
vltoz.alma ); //a kls takart (5)
//vltozra hivatkozs
Console.WriteLine( terlet(r));
//a terlet fggvny
// meghvsa
}
static float terlet(float sugr)
{
return(pi*sugr*sugr);
}
// fggvnydefinci
A backslash (\) karakter specilis jelentssel br. Az utna kvetkez karakter(eke)t, mint egy escape szekvencit dolgozza fl a fordt. Az gy hasznlhat
escape szekvencik a kvetkezk:
\a
\b
\f
\r
\n
a 7-es kd csipogs
backspace, elz karakter trlse
formfeed, soremels karakter
kocsi vissza karakter
j sor karakter (soremels+kocsi vissza)
tabultor karakter
fggleges tabultor
backslash karakter
aposztrf
idzjel
krdjel
xx s yy unikd karakter
string karaktersorozat
A System.String osztlynak megfelel tpus. Szvegek kztt a + s a +=
szvegsszefzst vgz opertorok ismertek. A [] opertor a szveg adott
index karaktert adja meg. Az indexels 0-val kezddik. A @ karakter kikszbli a szvegen belli rzkeny karakterek hatst. Ilyen pldul a
backslash (\) karakter.
Plda:
char c='\u001b';
string s="alma";
string n="alma"+"barack";
s+="fa";
//i=4
CompareTo(string)
Kt szveg sszehasonltst vgzi. Ha az eredmny 0, akkor azonos a kt
szveg:
string str1="egyik", str2="msik";
int cmpVal = str1.CompareTo(str2);
if (cmpVal = = 0)
// az rtkek azonosak
{}
else if (cmpVal > 0) // str1 nagyobb mint str2
{}
else
// str2 nagyobb mint str1
Equals(string)
Megadja, hogy a paramterl kapott szveg azonos-e az eredeti szveggel:
string str1="egyik", str2="msik";
if (str1.Equals(str2){}
// azonos
else{}
// nem azonos
IndexOf(string)
Tbb alakja van, megadja, hogy az eredetiben melyik indexnl tallhat a
paramterl kapott szveg. A visszaadott rtk 1 lesz, ha nincs benn a
keresett szveg:
int i="almafa".IndexOf("fa");
//4
Insert(int,string)
A msodik paramterl kapott szveget, az els paramterrel megadott
indextl beszrja az eredeti szvegbe:
// alma a fa alatt
A fenti plda nem ad eredmnyt, hiszen alaprtelmezsben a kis- s nagybet klnbzik, mg ha a regulris kifejezst egy kicsit mdostjuk, az albbiak
szerint:
Regex reg_kif = new Regex("adi");
8. bra
Mindkt egsz tpus eljeles, ha erre nincs szksgnk, hasznlhatjuk az eljel nlkli vltozatukat, melyek: uint, ushort, byte, ulong.
Vals szmok definilsakor a 10-es kitevt jell e konstans hasznlhat.
Plda:
float a=1.6e-3;
// 1.6 * 10-3
Az imnti fggvny paramternek jellse referencia szerinti paramtertadst jelent, amirl a Fggvnyek c. fejezetben rszletesen szlunk.
Mivel ez a tpus a System.Enum megfelelje, ezrt rendelkezik annak jellemzivel is. Ezek kzl a kt legjellemzbb a GetHashCode() s a ToString()
fggvny. Az elbbi a bels trolsi formt, a megfelel egsz szmot adja meg,
mg a ToString(), mint alaprtelmezett reprezentci, a szveges alakot
(kk,zld, stb) adja meg.
Plda:
jszinek s=jszinek.piros;
Console.WriteLine(s.GetHashCode());
// eredmny: 4
// eredmny 12 lesz
Bithez kttt rtkek esetn ktelez minden egyes konstans nvhez megadni a neki megfelel bites brzolst!
Az alaptpusokat a .NET keretrendszer biztostja, gy ennek a fejlesztsi
krnyezetnek egy msik nyelvben pontosan ezek a tpusok llnak rendelkezsre. Az termszetesen elfordulhat, hogy nem ezekkel a nevekkel kell rjuk
hivatkozni, de a nyelvi fordt biztosan ezen rtelmezs szerinti kdot (kztes
kd) fordtja le a keretrendszer, mint futtat krnyezet szmra.
Az alaptpusok zrsaknt meg kell jegyezni, hogy a mutat tpus is rtelmezett, ahogy a C++ vilgban, de ennek a hasznlata csak olyan C# programrszben megengedett, amely nem biztonsgos krnyezetben helyezkedik el (unsafe
context). Errl rviden a knyv XIV. fejezetben olvashat.
II.6. Feladatok
1. Milyen alaptpusokat ismer a C# nyelv?
2. Mi a vltoz s az lland kztt a klnbsg?
3. Mi a klnbsg egy statikus s egy dinamikus lettartam
vltoz kztt?
4. Definiljon kt szveg tpus vltozt, adja meg a hosszukat!
5. brzolja felsorols tpussal az NB 1 bajnoksg csapatait!
38
aritmetikai negls
logikai negls (not)
bitenknti negls,
inc, dec.
tpusknyszerts
Plda:
double d=2.3;
int i=(int) d;
// i=2
szorzs
oszts
maradkkpzs
<<
>>
// b rtke -1 marad
is
Logikai opertor, egy objektumrl megmondja, hogy a bal oldali operandus
a jobb oldali tpusnak egy vltozja-e.
Plda:
int i=3;
if (i is int) Console.WriteLine("Bizony az i egsz!");
else Console.WriteLine("Bizony az i nem egsz!");
as
Ktoperandus tpusknyszerts. A bal oldali vltozt a jobb oldali referencia tpusra
alaktja, ha tudja. Ha sikertelen az talakts, akkor eredmnyl a null rtket adja.
Plda:
double d=2.5;
Object o= d as Object;
Console.WriteLine(o);
// eredmny: 2.5
// Object-re mindent lehet alaktani, aminek van toString kir
//fggvnye. Errl bvebben ksbb esik sz.
// boxing, becsomagols
// unboxing, kicsomagols
GetType()
Megadja az objektum tpust, hasonl eredmnyt ad, mint a korbban ltott
typeof opertor.
Equals(object)
Megadja, hogy kt objektum egyenl-e, logikai rtket ad eredmnyl.
int i=5;
object o=i;
Console.WriteLine(o.Equals(5));
rtkads opertora
ahol a CTS (Common Type System) tpusnv az albbi lehet: Boolean, Int16
(short int), Int32 (rendes int), Int64 (hossz int), Float, Double, String, Decimal,
Byte, Char.
Plda:
string s="25";
int i=Convert.ToInt32(s);
// i=25 lesz
Plda:
double dd=Math.Sin(Math.PI/2);
Console.WriteLine(dd);
// rtke 1.
dd=Math.Pow(2,3);
Console.WriteLine(dd);
// 8
III.5. Feladatok
1. Mit neveznk ktoperandus opertornak?
2. Melyik opertor hrom operandus?
3. Milyen szm-szveg konverzis lehetsgeket ismer?
4. Fogalmazza meg kt elem kzl a nagyobb kivlasztst operator segtsgvel!
5. Ismerjk egy hromszg kt oldalt s kzbezrt szgt. Szmoljuk ki a
szggel szemkzti oldal hosszt!
// egsz vektordefinci
// 10 elem lesz az egsz vektorunk
// most meg 20 elem lett
// egy vltoz adja a hosszt
47
// vektorhossz meghatrozs
Ha logikai vektort definilunk, akkor a vektorelemek kezdrtkads hinyban logikai hamis (false), mg ha referencia vektort definilunk, akkor a
referenciaelemek a null kezdrtket kapjk meg.
Plda:
int[] numbers = {1, 2, 3, 4, 5};
int[] numbers = new int[5] {1, 2, 3, 4, 5};
string[] nevek = new string[3] {"Ali", "Pali", "Robi"};
int[] numbers = new int[] {1, 2, 3, 4, 5};
string[] nevek = new string[] {"Ali", "Pali", "Robi"};
A C# nyelvben nem csak a fenti egydimenzis vektor definilhat. Ezenkvl mg definilhat kt- vagy tbbindex, multidimenzis vektor, illetve vektorok vektora.
Multidimenzis vektor:
Plda:
string[,] nevek;
// 4
Hasznlat:
numbers[1,1] = 667;
Vektorok vektora:
A ms nyelvekbeli analgit tekintve, a multidimenzis vektorban minden
sorban azonos darabszm elem van, ez teht a szablyos, ngyzetes mtrix stb.
defincinak felel meg. A vektorok vektora pedig valjban egy mutat vektor
definci, ahol elszr megmondjuk, hogy hny elem a mutat vektor, majd
ezutn egyenknt meghatrozzuk, hogy az egyes elemek milyen vektorokat
jelentenek.
Plda:
byte[][] meres = new byte[5][];
for (int x = 0; x < meres.Length; x++)
{
meres[x] = new byte[4];
}
int[][] szamok= new int[2][]
{
new int[] {3,2,4},
// ez a hrom elem vektor lesz a szamok els vektora
new int[] {5,6}
// ez a kt elem vektor lesz a szamok msodik vektora
};
int[][] numbers =
new int[][] { new int[] {2,3,4}, new int[] {5,6,7,8,9} };
int[][] numbers = { new int[] {2,3,4}, new int[] {5,6,7,8,9} };
Ezek utn rjunk egy pldaprogramot, amely bemutatja a korbban megbeszlt vektorjellemzk hasznlatt:
Plda:
//vektor.cs
using System;
class vektorpelda
{
public static void Main()
{
// Sima vektordefinci, a definci pillanatban
// 5 elem vektor lesz
// A vektorelemeknek kln nem adtunk kezdrtket,
// ezrt azok 0 rtket kapnak.
int[] numbers = new int[5];
// Ktdimenzis vektor, sima 5x4-es szveges,
//ezen elemek inicializls hinyban null rtket kapnak.
string[,] names = new string[5,4];
// Vektorok vektora, ezt az irodalom gyakran
//"jagged array", (csipks, szaggatott vektor) nven emlti
byte[][] scores = new byte[5][];
// Az egyes vektorok definilsa
for (int i = 0; i < scores.Length; i++)
{
scores[i] = new byte[i+3]; // elemrl elemre n az elemszm.
}
// Egyes sorok hossznak kirsa
0
1
2
3
4
sor
sor
sor
sor
sor
hossza:
hossza:
hossza:
hossza:
hossza:
3
4
5
6
7
Plda:
string honapnev(int n)
{
string[]nv={"Nem ltezik","Janur",
"Februr","Mrcius",
"prilis","Mjus","Jnius",
"Jlius","Augusztus",
"Szeptember","Oktber",
"November","December"};
return(((n<1)||(n>12)) ? nv[0] : nv[n]);
}
IV.2. Struktra
Gyakran szksgnk van az eddigiektl eltr adatszerkezetekre, amikor a
lerni kvnt adatunkat nem tudjuk egy egyszer vltozval jellemezni. Elg,
ha a taln legkzenfekvbb feladatot tekintjk: hogyan tudjuk a sk egy pontjt
megadni? Egy lehetsges megadsi md, ha a pontot mint a sk egy derkszg koordintarendszernek pontjt tekintem, s megadom az X s Y koordintkat.
A struktradefinils az ilyen feladatok megoldsa esetn lehetv teszi,
hogy az sszetartoz adatokat egy egysgknt tudjuk kezelni.
A struktradefinci formja a kvetkez:
hozzfrs fggvnydefinci ;
};
Hivatkozs egy mezre: vltoznv.meznv
A struktrkon azonos tpus esetn az rtkads elvgezhet, gy ha pldul
a s b azonos tpus struktra, akkor az a=b rtkads szablyos, s az a minden
mezje felveszi b megfelel mezrtkeit.
Plda:
struct pont
{
int x;
int y;
};
pont a;
struct egy
{
string name;
int kor;
};
egy[] c=new egy[10];
Plda:
struct szemly
{
public string nv;
Plda:
struct alma
{
string nev="jonatn"; // fordtsi hiba
IV.3. Feladatok
1. Mit neveznk tmbnek?
V. Utastsok
A programvezrls menett az utastsok szekvencija szabja meg. Ahogy
korbban is lttuk, az opercis rendszer a Main fggvnynek adja t a vezrlst,
majd a fggvnytrzs egyms utn kvetkez utastsait (szekvencia) hajtja
vgre, ezutn tr vissza a vezrls az opercis rendszerhez.
Az utastsok fajti:
sszetett utasts
kifejezs utasts
elgazs utasts
ciklus utasts
ugr utasts
56
V. Utastsok
switch (kifejezs) {
case rtk1: utasts1 ;
case rtk2: utasts2 ;
default: utasts ;
};
V. Utastsok
A switch utni kifejezs nem csak egsz rtk lehet, hanem szveg (string)
is. Ha a kifejezs rtke a case utn megadott rtkkel nem egyezik meg, akkor a
kvetkez case utni rtk vizsglata kvetkezik. Ha egy case utni rtk azonos
a kifejezs rtkvel, akkor az ez utni utasts vgrehajtdik. Ha egy case gban nincs egyrtelm utasts arra vonatkozan, hogy hol folytatdjon a vezrls, akkor fordtsi hibt kapunk.
A C++ nyelvet ismerk tudhatjk, hogy abban a nyelvben egy case g vgt
nem kellett vezrlstadssal befejezni, s ebbl gyakran addtak hibk.
Minden elgazsgat, mg a default gat is, ktelez valamilyen vezrlstadssal befejezni! (break, goto, return)
Plda:
switch (parancs)
{
case "run":
Run();
break;
case "save":
Save();
break;
case "quit":
Quit();
break;
default:
Rossz(parancs);
break;
}
A case belpsi pont utn csak egy rtk adhat meg, intervallum vagy tbb
rtk megadsa nem megengedett, hiszen ezek az 'rtkek' gyakorlatilag egy
cmke szerept tltik be. Ha kt rtkhez rendeljk ugyanazt a tevkenysget,
akkor kt cmkt kell definilni.
Plda:
switch (a)
{
case 1:
case 2:
Console.WriteLine("Egy s kett esetn");
break;
default:Console.WriteLine("Egybknt");
break;
};
V. Utastsok
V. Utastsok
V.4.2. do utasts
Az utasts formja:
do utasts; while (kifejezs) ;
A ciklusmag a do s a while kztti rsz vgrehajtsa utn kirtkeli a
kifejezst, s amg a kifejezs igaz rtket ad, megismtli a ciklusmag vgrehajtst. A do ciklust szoks htultesztel ciklusnak is nevezni.
Plda:
string nv;
do
{
Console.WriteLine("Ki vagy?");
nv=Console.ReadLine();
}
while (nv!="Zoli");
Console.WriteLine("Szia {0}!",nv);
do
Console.WriteLine("Biztos egyszer lefut!");
while(false);
V. Utastsok
Plda:
for (int i=0; i<10; i++)
Console.WriteLine("Hajr Fradi!");
V. Utastsok
Plda:
using System;
public class adatsor
{
int[] elemek;
public adatsor()
{
elemek = new int[5] {12, 44, 33, 2, 50};
}
public vektor GetEnumerator()
{
return new vektor(this);
}
// Az "enumerator", class definils:
public class vektor
{
int Index;
adatsor a;
public vektor(adatsor ad)
{
a = ad;
Index = -1;
}
public bool MoveNext()
{
Index++;
return(Index < a.elemek.GetLength(0));
}
public int Current
{
get
{
return(a.elemek[Index]);
}
}
}
}
public class MainClass
{
public static void Main()
{
adatsor adatok = new adatsor();
V. Utastsok
Console.WriteLine("Az adatsor elemei:");
// elemek kirsa
foreach (int i in adatok)
{
Console.WriteLine(i);
}
}
}
/*Eredmny:
12
44
33
2
50*/
V. Utastsok
Hatsra a legbels while, for, do ciklus utastsokat vezrl kifejezsek
kerlnek kirtkelsre. (A ciklus a kvetkez ciklusmag vgrehajtshoz
kszl.)
Plda:
int i=1;
while(true)
{
i++;
if (i<=10) continue;
// 10 elem ciklus
// kvetkez ciklusmag
if (i==11) break;
// Ciklus vge
Console.WriteLine( i);
int i=1;
switch (i)
{
case 0:
nulla();
V. Utastsok
goto case 1;
case 1:
egy();
goto default;
default:
valami();
break;
V. Utastsok
Ez a hasznlat az albbi kdrszletnek felel meg, a nem ismert nyelvi elemeket ksbb ismertetjk:
V. Utastsok
{
lock(typeof(adatok))
{
szamlalo++;
Console.WriteLine("Adatments elindul!");
for(int i=0;i<50;i++)
{
Thread.Sleep(1);
Console.Write(s);
}
Console.WriteLine("");
Console.WriteLine("Adatments {0}.alkalommal
befejezdtt!",szamlalo);
}
V.6. Feladatok
1. Milyen tpus adat szerint kszthetnk tbbirny (switch) elgazst?
2.
VI. Fggvnyek
VI.1. A fggvnyek paramtertadsa
Ha egy fggvnynek adatot adunk t paramterknt, akkor alapveten kt
klnbz esetrl beszlhetnk. Egy adat rtk szerint s hivatkozs szerint
kerlhet tadsra. Az els esetben valjban az eredeti adatunk rtknek egy
msolata kerl a fggvnyhez, mg a msodik esetben az adat cme kerl tadsra.
68
VI. Fggvnyek
Plda:
class faktor
VI. Fggvnyek
VI. Fggvnyek
Plda:
void mdost(int[] vektor)
{
// a vektort, mint egy referencit kapjuk paramterl
// ez rtk szerint kerl tadsra, azaz ez a referencia
//nem vltozik, vltozik viszont a 0. tmbelem, s ez a
// vltozs a hv oldalon is ltszik
vektor[0]=5;
}
Ahogy a fenti pldn is lthat, a vektor paramterknt a referencijval kerl tadsra. Ez rtk szerinti paramtertadst jelent. Ha egy fggvnyben a
mutatott rtket (vektorelemet) megvltoztatom, akkor a vltozs a kls, paramterknt tadott vektorban is lthat lesz!
A nyelvben a vektor tudja magrl, hogy hny eleme van (Length), ezrt
ellenttben a C++ nyelvvel , az elemszmot nem kell tadni.
Tmb esetben is alkalmazhatjuk a referencia vagy out paramter tadsnak lehetsgt. Ennek illusztrlsra nzzk a kvetkez pldkat:
1. plda:
using System;
class teszt
{
static public void feltlt(out int[] vektor)
{
// a vektor ltrehozsa, s inicializlsa
vektor = new int[5] {1, 2, 3, 4, 5};
}
static public void Main()
{
int[] vektor; // nem inicializltuk
// meghvjuk a feltlt fggvnyt:
feltlt(out vektor);
// A vektorelemek kirsa:
Console.WriteLine("Az elemek:");
for (int i=0; i < vektor.Length; i++)
Console.WriteLine(vektor[i]);
}
}
VI. Fggvnyek
2. plda:
using System;
class Refteszt
{
public static void feltlt(ref int[] arr)
{
// Ha hv fl mg mg nem ksztette el,
//akkor megtesszk itt.
if (arr == null)
arr = new int[10];
// nhny elem mdosts
arr[0] = 123;
arr[4] = 1024;
// a tbbi elem rtke marad az eredeti
}
static public void Main ()
{
// Vektor inicializlsa
int[] vektor = {1,2,3,4,5};
// Vektor tadsa ref, paramterknt:
feltlt(ref vektor);
// Kirs:
Console.WriteLine("Az elemek:");
for (int i = 0; i < vektor.Length; i++)
Console.WriteLine(vektor[i]);
}
VI. Fggvnyek
A parancssor-argumentumok hasznlatra nzzk az imnt mr emltett
echo parancs egy lehetsges megvalstst.
Plda:
static void Main(string[] args)
{
int i=0;
while (i<args.Length)
{
Console.WriteLine(args[i]);
i++;
}
}
9. bra
VI. Fggvnyek
A Main fggvnyt, abban az esetben, ha a parancssori paramtereket nem
akarjuk feldolgozni, a paramterei nlkl is deklarlhatjuk:
static void Main()
{}
VI. Fggvnyek
Az eredmny a kvetkez lesz:
1
2
3
1
fradi
teszt
3.5
10
11
12
VI. Fggvnyek
Hatrozzuk meg kt szm maximumt! Ha el szeretnnk kerlni a tpuskonvertlst mondjuk egsz tpusrl valsba s fordtva, akkor kln az
egsz s kln a vals szmok esetre is meg kell rnunk a maximum fggvnyt.
Knyelmetlen dolog lenne, ha mondjuk egszmax s valsmax nven kellene megrni a kt fggvnyt. Mindkt esetben szeretnnk a maximum
fggvnynevet hasznlni, hogy ne neknk kelljen eldnteni azt, hogy az
egszek vagy valsak maximumt akarjuk-e meghatrozni, hanem dntse el a
fordt a paramterlista alapjn automatikusan, hogy melyik fggvnyt is kell
az adott esetben meghvni.
Plda:
// vals maximum fggvny
double maximum(double x,double y)
{
if (x>y)
return x;
else
return y;
}
// egsz maximum fggvny
int maximum(int x,int y)
{
if (x>y)
return x;
else
return y;
}
int a=2,b=4;
double c=3.123, d=2;
Console.WriteLine(maximum(4.1,2));
Console.WriteLine(maximum(4,2));
Console.WriteLine(maximum(a,b));
Console.WriteLine(maximum(c,d));
// vals hvs
// egsz hvs
// egsz hvs
VI. Fggvnyek
Az elbbi pldban teht a pelda deleglt tpust definiltuk. Ez olyan fggvnytpus, amelyiknek egy egsz s egy szveg paramtere van, s eredmnyl
egy egsz szmot ad.
Egy deleglt objektumnak vagy egy osztly statikus fggvnyt, vagy egy
osztly pldnyfggvnyt adjuk rtkl. Deleglt meghvsnl a hagyomnyos fggvnyhvsi formt hasznljuk. Ezek utn nzznk egy konkrt
pldt:
Plda:
using System;
class proba
{
public static int negyzet(int i)
{
return i*i;
}
public int dupla(int i)
{
return 2*i;
}
}
VI. Fggvnyek
class foprogram
{
delegate int emel(int k); // az emel deleglt definilsa
VI. Fggvnyek
class foprogram
{
delegate int emel(int k);
delegate void meghiv(int j);
public static void Main()
{
emel f=new emel(proba.negyzet);
Console.WriteLine(f(5));
proba p=new proba();
emel g=new emel(p.dupla);
Console.WriteLine(g(5));
emel h=new emel(p.tripla);
g+=h;
//g single cast, g a tripla lesz
Console.WriteLine(g(5));
// eredmny: 15
meghiv m=new meghiv(p.egy);
// multicast deleglt
m+=new meghiv(p.ketto);
m(5);
// deleglt hvs, eredmny 5,10
}
}
VI. Fggvnyek
Az esemnyhez zrskppen meg kell jegyezni, hogy az egsz keretrendszer
a felhasznli tevkenysget ehhez a lehetsghez rendeli akkor, amikor klasszikus Windows alkalmazst akarunk kszteni.
Pldaknt nzzk meg egy Windows alkalmazs esetn a form tervez ltal
generlt kdot. A form (this) objektuma egy vlasztmez (ComboBox), ampl
nvre hallgat. Ennek knyvtri esemnye, a SelectedIndexChanged vgrehajtdik (a keretrendszer hajtja vgre), ha mdostunk a vlasztson.
Mikor ehhez az esemnyhez egy esemnykezel fggvnyt definilunk
ampl_SelectedIndexChanged nven, akkor az albbi sort adja a programhoz a
tervez:
Plda:
this.ampl.SelectedIndexChanged += new
System.EventHandler(this.ampl_SelectedIndexChanged);
VI.6. Feladatok
1. Milyen paramtertadsi mdokat ismer?
2. Mikor definilhatunk azonos nvvel fggvnyeket egy osztlyban?
3. Hogyan kell vltoz paramterszm fggvnyt hasznlni?
4. rjon egy fggvnyt, amely a paramterknt megadott nhny nv kzl
a leghosszabb hosszat adja meg!
5. Definiljon kupafordul esemnyt, melyekre a szurkolk jelentkezhetnek. Kupafordul esetn hvjuk meg a feliratkozott szurkolkat a
mrkzsre!
VII. Osztlyok
C#-ban az osztlyok a mr ismert sszetett adatszerkezetek (struktrk) egy
termszetes kiterjesztse. Az osztlyok nemcsak adattagokat, hanem opertorokat, fggvnyeket is tartalmazhatnak. Az osztlyok hasznlata esetn ltalban
az adatmezk az osztly ltal ppen lerni kvnt esemny llapotjelzi, mg a
fggvnymezk az llapotvltozsokat rjk le, felhasznli felletet biztostanak. A fggvnymezket gyakran metdusoknak is nevezi a szakirodalom.
Osztlymezket lehetsgnk van zrtt nyilvntani (encapsulation), ezzel
biztostva az osztly bels harmnijt. Ezek az osztlymezk ltalban az
llapotjelz adatmezk.
j ignyek, mdostsok esetn lehetsgnk van az eredeti osztly megtartsa mellett, abbl a tulajdonsgok megrzsvel egy j osztly szrmaztatsra,
amely rkli (inheritance) az sosztly tulajdonsgait (az osztlyok elemeit). A
C++ nyelvben lehetsgnk van arra, hogy tbb osztlybl szrmaztassunk
utdosztlyt (multiple inheritance), esetnkben ezt a jellemzt a CLR nem tmogatja, gy ennek a fejlesztkrnyezetnek egyik nyelve sem tmogatja a tbbszrs rkls lehetsgt. Lehetsgnk van interface defincira, amiket egy osztly implementlhat. Egy osztly tbb interface-t is implementlhat.
Az rkls lehetsgnek a gyakorlatban legelszr jelentkez haszna taln
az, hogy a programunk forrskdja jelentsen cskkenhet.
Egy osztlytpus vltozt, az osztly megjelensi alakjt gyakran objektumnak is szoks nevezni.
Az osztlyok hasznlathoz nhny jtancsot, a nyelv jobbkz-szablyt
a kvetkez pontokban foglalhatjuk ssze. Ezek a tancsok termszetesen nem a
nyelv tanulsi idszakra, hanem a ksbbi, a nyelvben trtn programozsi
feladatokra vonatkoznak elssorban.
Ha egy programelem nll rtelmezssel, feladattal, tulajdonsgokkal
rendelkezik, akkor definiljuk ezt az elemet nll osztlyknt.
Ha egy programrsz adata nll objektumknt rtelmezhet, akkor
definiljuk t a kvnt osztlytpus objektumaknt.
Ha kt osztly kzs tulajdonsgokkal rendelkezik, akkor hasznljuk az
rkls lehetsgt.
ltalban is elmondhat, hogy ha a programokban az osztlyok kzs
vonsokkal rendelkeznek, akkor trekedni kell univerzlis bzisosztly
ltrehozsra. Gyakran ezt absztrakt bzisosztlynak is nevezzk.
Az osztlyok definilsakor kerljk a nyitott (publikus) adatmezk
hasznlatt.
81
VII. Osztlyok
private
public
protected
internal
protected internal.
VII. Osztlyok
Plda:
class els {
private int x;
// az x mez privt
public void bellt(int mennyi)
{ x=mennyi;}
// fggvnymez
public int kiolvas()
{ return x;}
}
Mivel az x az osztly privt mezje, ezrt definiltunk az osztlyba kt fggvnymezt, amelyek segtsgvel be tudjuk lltani, illetve ki tudjuk olvasni az x
rtkt. Ahhoz, hogy ezt a kt fggvnyt az osztlyon kvlrl el tudjuk rni,
publikusnak kellett ket deklarlni.
static void Main(){
els a = new els();
VII. Osztlyok
Statikus mezket a static jelz kirsval definilhatunk. Ekkor az adott
mez minden objektum esetben kzs lesz. A statikus mez kezdrtke
inicializls hinyban 0, null, false lesz.
Plda:
class teszt {
public static int a;
// rtke mg 0
public static string s="Katalin";
};
teszt.a=5;
// statikus mez rtkadsa, 5 az rtk
VII. Osztlyok
Plda:
using System;
class binfa
{
int x;
// elem
int db;
// elemszm
public binfa(int i)
// konstruktor
{
x=i; db=1;
bal=jobb=null;
}
public binfa bal, jobb;
public void illeszt(int i)
{
if (x==i) db++;
else if (i<x) if (bal!=null) bal.illeszt(i);
else bal= new binfa(i);
// bal oldalra illesztettk az elemet
else if (jobb!=null) jobb.illeszt(i);
else jobb= new binfa(i);
// jobb oldalra illesztnk
}
public void bejar()
{
// elszr bejrjuk a bal oldali ft
if (bal!=null) bal.bejar();
// ezutn jn az aktulis elem
Console.WriteLine("Az aktulis elem: {0} darabszm:
{1}",x,db);
// vgl a jobb oldali fa kvetkezik
if (jobb!=null) jobb.bejar();
}
}
class program
{
public static void Main()
{
binfa bf=new binfa(7);
Console.WriteLine("Binris fa plda.");
bf.illeszt(5);
bf.illeszt(9);
bf.illeszt(5);
bf.bejar();
}
}
VII. Osztlyok
Futsi eredmnyl az albbit kapjuk:
10. bra
VII. Osztlyok
class program
{
public static void Main()
{
// valahol itt a program elejn kerl meghvsra a
// statikus_osztly statikus konstruktora, az x rtke 2 lesz!!!
Console.WriteLine(statikus_osztaly.x);
// 2
statikus_osztaly s=new statikus_osztaly();
// dinamikus pldny
Console.WriteLine(s.getx()); // termszetesen ez is 2 lesz
}
}
VII. Osztlyok
class program
{
public static void Main()
{
// nem lehet nincs_peldanya tpus vltozt definilni
Console.WriteLine(nincs_peldanya.x);
// 4
// csak a statikus mezket hasznlhatjuk
nincs_peldanya.fv1();
}
}
VII. Osztlyok
Plda:
class osztly
{
~osztly()
{ .
// destruktor fggvnytrzs
}
}
VII. Osztlyok
Ha egy objektumnak nincs szksge mr semmilyen destrukcira, Finalize
fggvnyhvsra, akkor a paramterl adott objektum ilyen lesz:
void System.GC.ReRegisterForFinalize(Object o);
Itt kell szt ejtennk arrl, hogy a nyelv using utastsnak segtsgvel
(lsd a Nyelvi utastsok fejezetet) tmr kd rhat.
A destrukci folyamata lnyegben a hatkony erforrs-gazdlkodshoz
nyjt segtsget. Ennek egyik leglnyegesebb eleme a memriagazdlkods. Br
a mai szmtgpek vilgban a memria nagysga nem a kritikus paramterek
kztt szerepel, azrt elfordulhat, a fejlesztsek sorn az alkalmazsunk
memriahinyban szenved. Ekkor segtsget adhatunk a memria-visszanyer
szemtgyjtsi algoritmusnak ahhoz, mely terleteket lehet visszaadni a
VII. Osztlyok
rendszer rszre. A kritikus esetben visszaadhat objektumok hivatkozsait
gyenge referencinak (weak reference) nevezzk. Ezeket az objektumokat
erforrs hinyban a keretrendszer felszabadtja. Ilyen objektumot a
WeakReference tpus segtsgvel tudunk ltrehozni.
Plda:
VII. Osztlyok
// NEM DEFINILUNK DESTRUKTORT
// MERT AZ AUTOMATIKUS SZEMTGYJTSI
// ALGORITMUS FELSZABADTJA A MEMRIT
public void push(Object i)
{
if (mut<x.Length)
{
x[mut++]=i;
}
// beillesztettk az elemet
}
public Object pop()
{
if (mut>0) return x[--mut];
// ha van elem, akkor visszaadjuk a tetejrl
else return null;
}
}
class program
{
public static void Main()
{
verem v=new verem(6);
v.push(5);
v.push("alma");
Console.WriteLine(v.pop());// alma kivtele a verembl
// az 5 mg bent marad
}
}
VII. Osztlyok
Egy konstans mez elrshez nincs szksg arra, hogy a tpusbl egy vltozt ksztsnk, ugyanis a konstans mezk egyben statikus mezk is. Ahogy lthat, a konstans mezt helyben inicializlni kell, ebbl pedig az kvetkezik,
hogy minden ksbb definiland osztlyvltozban ugyanezen kezdrtkads
hajtdik vgre, teht ez a mez minden vltozban ugyanaz az rtk lehet. Ez
pedig a statikus mez tulajdonsga.
VII. Osztlyok
class olvashatosapp
{
public static void Main()
{
csak_olvashato o=new csak_olvashato(5);
Console.WriteLine(o.x);
// rtke 5
csak_olvashato p=new csak_olvashato(6);
Console.WriteLine(p.x);
// rtke 6
p.x=8;
// fordtsi hiba, x csak olvashat!!!!
}
}
VII. Osztlyok
}
set
{
return nev;
nev=value;
}
public Ember(string n, int k)
{
nev=n; kor=k;
}
}
class program
{
public static void Main()
{
Ember e=new Ember("Zoli", 16);
//a Nev tulajdonsg hvsa
Console.WriteLine(e.Nev); // a Nev property get blokk hvsa
e.Nev="Pali";
// a Nev property set blokkjnak hv// sa a value vltozba kerl a "Pali"
}
}
Ha a tulajdonsg fggvnynek csak get blokkja van, akkor azt csak olvashat tulajdonsgnak (readonly) nevezzk.
Ha a tulajdonsg fggvnynek csak set blokkja van, akkor azt csak rhat
tulajdonsgnak (writeonly) nevezzk.
VII. Osztlyok
}
class program
{
static void Main()
{
valami a=new valami();
a[2]=5;
// az indexer set blokk hvsa
Console.WriteLine(a[2]);
// 5, indexer get hvsa
}
}
VII. Osztlyok
Plda:
public string this[int x]
{
get
{
return s[x];
}
set
{
s[x]=value;
}
}
VII. Osztlyok
class program
{
static int ngyzet(plda a)
{
a.X=5;
return (a.X*a.X);
}
static void Main()
{
plda b=new plda(3);
Console.WriteLine(ngyzet(b));
}
}
Mikor egy fggvny paramterknt (rtk szerint) egy osztlyt kap, akkor a
fggvnyparamter egy rtkreferencit kap, s nem egy msolata kszl el az
eredeti osztlyvltoznak.
Teljesen hasonl akkor a helyzet, mikor egy fggvny osztlytpust ad
visszatrsi rtkknt.
VII. Osztlyok
Az opertor fggvny defincijnak formja:
static visszatrsi_rtk operator?(argumentum)
{
// fggvnytrzs
}
Az operator kulcssz utni ? jel helyre az jradefinilni kvnt opertor
neve kerl. Teht ha pldul az sszeads (+) opertort szeretnnk fellbrlni,
akkor a ? helyre a + jel kerl.
Az irodalomban az opertor jradefinilst gyakran opertor overloadingnak hvjk.
Az opertorok precedencija jradefinils esetn nem vltozik, s az
operandusok szmt nem tudjuk megvltoztatni, azaz pldul nem tudunk olyan
/ (oszts) opertort definilni, amelynek csak egy operandusa van.
Az opertor fggvnyek rkldnek, br a szrmaztatott osztlyban az sosztly opertor fggvnyei igny szerint jradefinilhatak.
Az opertor fggvny argumentumval kapcsolatosan elmondhatjuk, hogy
egyoperandus opertor esetn egy paramtere van, mg ktoperandus opertor
esetn kt paramtere van a fggvnynek.
Meg kell emlteni, hogy a C++ nyelvhez kpest nem olyan ltalnos az
opertor jradefinils lehetsge, de az is igaz, hogy sok, ma npszer programozsi nyelv (Java, Delphi, ) mg ennyit se nyjt.
Tekintsk els pldaknt a komplex szmokat megvalst osztlyt, amelyben az sszeads opertort szeretnnk definilni oly mdon, hogy egy komplex
szmhoz hozz tudjunk adni egy egsz szmot. Az egsz szmot a komplex
szm vals rszhez adjuk hozz, a kpzetes rsz vltozatlan marad.
Plda:
using System;
class komplex
{
private float re,im;
public komplex(float x,float y) // konstruktor
{
re=x; im=y;
}
float Re
{
get
{
return re;
}
VII. Osztlyok
set
{
}
re=value;
}
float Im
{
get
{
}
set
{
}
return im;
im=value;
}
public static komplex operator+(komplex k,int a)
{
komplex y=new komplex(0,0);
y.Re=a+k.Re;
y.Im=k.Im;
return y;
}
VII. Osztlyok
A k+4 sszeads gy rtelmezend, hogy a k objektum + fggvnyt hvtuk
meg a k komplex szm s a 4 egsz szm paramterrel, azaz k.+(k,4)
fggvnyhvs trtnt.
Abban az esetben, ha a komplex + komplex tpus sszeadst szeretnnk
definilni, akkor egy jabb opertor fggvnnyel kell a komplex osztlyt bvteni. Ez a fggvny a kvetkezkppen nzhet ki:
public static komplex operator+(komplex a, komplex b)
{
komplex temp=new komplex(0,0);
temp.re= b.re+a.re;
temp.im= b.im+a.im;
return temp;
}
VII. Osztlyok
Konverzis opertornl az opertor jel helyett azt a tpust rjuk le, amire
konvertlunk, mg paramterl azt a tpust adjuk meg, amirl konvertlni akarunk.
Visszatrve a fenti komplex szm krdsre, az egsz + komplex opertor
helyett az albbi opertort is definilhattuk volna:
public static implicit operator komplex(int a)
{
komplex y=new komplex(0,0);
y.Re=a;
return y;
}
komplex k=(komplex) 5;
Console.WriteLine(k.Re);
// 6
Termszetesen egy komplex szmhoz rtkads tjn rendelhetnk egy vals szmot is, mondjuk oly mdon, hogy a komplex szm vals rszt adja a
vals szm, mg a kpzetes rsz legyen 0.
Kt egyoperandus opertor, a ++ s a -- esetben, ahogy az opertorok
trgyalsnl is lttuk, ltezik az opertorok postfix illetve prefix formj
hasznlata is:
komplex k=new komplex(1,2);
k++;
// postfix ++
++k;
// prefix forma
VII. Osztlyok
Ha definilunk ++ opertor fggvnyt, akkor ezen kt opertor esetben
mindkt forma hasznlatnl ugyanaz az opertor fggvny kerl meghvsra.
public static komplex operator++(komplex a)
{
a.Re=a.Re+1;
a.Im=a.Im+1;
return a;
}
Befejezsl a true, false egyoperandus opertor definilsnak lehetsgrl kell rviden szlni. A C++ nyelvvel ellenttben, ahol egy adott tpust logikainak is tekinthetnk (igaz, ha nem 0, hamis, ha 0), a C# nyelvben a mr korbbrl
ismert
if (a) utasts;
Ez a definci ebben az esetben azt jelenti, hogy egy komplex szm akkor
tekinthet logikai igaz rtknek, ha a szm vals rsze pozitv.
Plda:
komplex k=new komplex(2,0);
if (k) Console.WriteLine("Igaz");
VII. Osztlyok
Vgl azt kell megemlteni, hogy a logikai true, false opertorok mintjra,
azokhoz hasonlan csak prban lehet jradefinilni nhny opertort. Ezek az
opertorok a kvetkezk:
==, !=
<, >
<=, >=
interface IAlma
{
bool nyri();
double termstlag();
}
VII. Osztlyok
A fenti pldban definiltuk az Ialma interface-t, ami mg nem jelent
kzvetlenl hasznlhat tpust, hanem csak azt rja el, hogy annak a tpusnak,
amelyik majd ennek az IAlma tpusnak a tulajdonsgait is magn viseli, ktelezen definilnia kell a nyri(), s a termstlag() fggvnyeket. Teht errl a
tpusrl azt tudhatjuk, hogy az interface ltal elrt tulajdonsgokkal biztosan
rendelkezni fog. Ezen ktelez tulajdonsgok mellett termszetesen tetszleges
egyb jellemzkkel is felruhzhatjuk majd az osztlyunkat.
Amikor knyvtri elrsokat, interface-eket implementlunk, akkor ltalban
az elnevezsek az I betvel kezddnek, utalva ezzel a nv ltal jelzett tartalomra.
Egy interface elrsai kz nem csak fggvnyek, hanem tulajdonsgok s
indexer elrs megadsa s esemny megadsa is beletartozhat.
Plda:
interface IPozci
{
int X { get; set;
int Y { get; }
int Z { set; }
int this[int i] {
int this[int i] {
int this[int i] {
}
}
// readonly tulajdonsg
// csak rhat tulajdonsg
get; set;} // read-write indexer
get; } // read-only indexer
set;} // write-only indexer
VII. Osztlyok
return 230;
else return 0;
}
class program
{
public static void Main()
{
jonatn j=new jonatn(8);
Console.WriteLine(j.termstlag());
// 230 kg az tlagterms
}
}
VII. Osztlyok
public double termstlag()
{
return 250;
}
public string csomagols_mdja()
{
return "kontner";
}
public bool szllt()
{
return false;
}
}
class program
{
public static void Main()
{
jonatn j=new jonatn();
Console.WriteLine(j.termstlag());// 250 kg az tlagterms
Console.WriteLine(j.csomagols_mdja()); // kontner
}
}
VII. Osztlyok
Hasonlan az osztlyok mezhozzfrsi rendszerhez, tbb nyelvben is
lehetsg van arra, hogy rkls esetn az utdosztly az sosztly egyes mezit
tbbfle (private, protected , public) mdon rklheti. A C# nyelvben a .NET
Frameworknek (Common Type System) ksznheten erre nincs md. Minden
mez automatikusan, mintha publikus rkls lenne, megtartja sosztlybeli
jelentst.
Ekkor az sosztly publikus mezi az utdosztlyban is publikus mezk, s
a protected mezk az utdosztlyban is protected mezk lesznek.
Egy stpus referencia brmely utdtpusra hivatkozhat.
Az sosztly privt mezi az utdosztlyban is privt mezk maradnak az
sosztlyra nzve is, gy az sosztly privt mezi kzvetlenl az utdosztlybl
sem rhetk el. Az elrsk pldul publikus, n. kzvett fggvny
segtsgvel valsthat meg.
Az elrsi mdok gyakorlati jelentst nzzk meg egy sematikus pldn
keresztl:
class s
{
private int i;
protected int j;
public int k;
public void f(int j)
{ i=j; };
}
// privt mez
// protected meztag
// publikus mezk
class utd: s
{
};
Ekkor az utdosztlynak helybl lesz egy protected mezje, a j egsz vltoz, s lesz kt publikus mezje, a k egsz vltoz s az f fggvny.
Osztlyknyvtrak hasznlata mellett (pl. MFC for Windows, Windows NT)
gyakran tallkozunk azzal az esettel, mikor a knyvtrosztly protected mezket
tartalmaz. Ez azt jelenti, hogy a fggvnyt, mezt olyan hasznlatra szntk,
hogy csak szrmaztatott osztlybl tudjuk hasznlni.
A C# nyelvben nincs lehetsgnk tbbszrs rkls segtsgvel
egyszerre tbb sosztlybl egy utdosztlyt szrmaztatni. Helyette viszont tetszleges szm interface-t implementlhat minden osztly.
class utd: s, interface1,
{
};
//
VII. Osztlyok
Konstruktorok s destruktorok hasznlata rkls esetn is megengedett.
Egy tpus definilsakor a konstruktor fggvny kerl meghvsra, s ekkor
elszr az sosztly konstruktora, majd utna az utdosztly konstruktora kerl
meghvsra, mg destruktor esetn fordtva, elszr az utdosztly majd utna az
sosztly destruktort hvja a rendszer. Termszetesen a destruktor hvsra az
igaz, hogy a keretrendszer hvja meg valamikor azutn, hogy az objektumok
lettartama megsznik.
Paramteres konstruktorok esetn az utdkonstruktor alakja:
utd(paramterek): base(paramterek)
{
//
VII. Osztlyok
// Kimlskor fordtva, elszr a b majd az a
// destruktora kerl meghvsra
}
VII. Osztlyok
1. plda:
abstract class os
{
private int e;
public os()
{
e=5;
}
//
//
}
os x= new os(); //
//
2. plda:
using System;
abstract class os
{
private int e;
public os(int i)
{
e=i;
}
public abstract int szamol();
public int E
{
get
{
return e;
}
}
}
class szamolo:os
{
public szamolo():base(3)
{
}
public override int szamol()
{
return base.E*base.E;
}
}
VII. Osztlyok
class program
{
public static void Main()
{
szamolo f=new szamolo();
Console.WriteLine(f.szamol()); // eredmny: 9
}
}
VII. Osztlyok
class kor:pont
{
private int r;
public kor()
{
r=5;
}
public void kiir()
{
Console.WriteLine(r);
}
}
class program
{
public static void Main()
{
kor k=new kor();
pont p=new pont();
p.kiir();
//2,1
k.kiir();
//5
}
}
VII. Osztlyok
Ha azt szeretnnk elrni, hogy mindig a dinamikusan hozztartoz fggvnyt
hvja meg, akkor az sosztly fggvnyt virtulisnak (virtual), mg az utdosztly
fggvnyt felldefiniltnak (override) kell nevezni, ahogy az albbi plda is mutatja.
Plda:
using System;
class pont
{
private int x,y;
public pont()
{
x=2;y=1;
}
virtual public void kiir()
{
Console.WriteLine(x);
Console.WriteLine(y);
}
}
class kor:pont
{
private int r;
public kor()
{
r=5;
}
override public void kiir()
{
Console.WriteLine(r);
}
}
public class MainClass
{
public static void Main()
{
kor k=new kor();
pont p=new pont();
p.kiir();
// pont kiir2,1
k.kiir();
// kor kiir 5
p=k;
// a pont a korre hivatkozik
p.kiir();
// kor kiir 5 a kor kiir kerl
// meghvsra, mert a kiir fggvny virtulis, gy a
// kiir hvsakor mindig a vltoz aktulis, s nem
// pedig az eredeti tpust kell figyelembe venni.
}
}
VII. Osztlyok
Ez a tulajdonsg az osztlyszerkezet rugalmas bvtst teszi lehetv, mg a
programkd bonyolultsga jelentsen cskken.
Gyakran elfordul, hogy az sosztlyban nincs szksgnk egy fggvnyre,
mg a szrmaztatott osztlyokban mr igen, s szeretnnk, ha virtulisknt tudnnk definilni. Ebben az esetben az sosztlyban egy absztrakt fggvnydefincit kell hasznlnunk, ahogy az albbi pldban olvashat.
Plda:
abstract class pont
// absztrakt osztly, ebbl nem
{
// lehet pldnyt kszteni
protected int x,y;
public pont()
{
x=20;y=10;
}
abstract public void rajzol();
public void mozgat(int dx, int dy)
{
x+=dx;
y+=dy;
// rajzol hvs
rajzol();
}
}
class kor:pont
{
private int r;
public kor()
{
r=5;
}
override public void rajzol()
{
Console.WriteLine("Megrajzoljuk a krt az {0}, {1}
pontba, {2} sugrral.",x,y,r);
}
}
public class MainClass
{
public static void Main()
{
// pont p=new pont(); utastshibt eredmnyezne
kor k=new kor();
k.mozgat(3,4);
}
}
VII. Osztlyok
VII. Osztlyok
VII.11. Feladatok
1. Mi a klnbsg egy struktra s egy osztly kztt?
2. Milyen szerepe van a konstruktoroknak, destruktoroknak? Milyen konstruktorok definilhatk?
3. Mi a klnbsg az osztly, az absztrakt osztly is az interface kztt?
4. Definiljon btor osztlyt a jellemz tulajdonsgokkal! (Btor neve,
alapanyaga, rendeltetse, ra) A megadott tulajdonsgokhoz ksztse el a
kezel fggvnyeket!
Ksztsen lapraszerelt nvvel interface-t, amiben az sszeszerelsi
utastst rjuk el! Mdostsa az elz btor osztlyt lapraszerelt btorra, amelyik implementlja a lapraszerelt interface-t, biztostva azt, hogy
ennek a tpusnak biztosan legyen sszeszerelsi utastsa.
VIII. Kivtelkezels
Egy program, programrsz vagy fggvny vgrehajtsa formlis eredmnyessg tekintetben hrom kategriba sorolhat.
A fggvny vagy programrsz vgrahajtsa sorn semmilyen rendellenessg nem lp fel.
A fggvny vagy programrsz aktulis hvsa nem teljesti a paramterekre vonatkoz elrsainkat, gy ekkor a sajt hibavdelmnk eredmnyeknti hibval fejezdik be a vgrehajts.
A fggvny vagy programrsz vgrehajtsa sorn elre nem lthat hibajelensg lp fel.
Ezen harmadik esetben fellp hibajelensgek programban trtn kezelsre nyjt lehetsget a kivtelkezels (Exception handling) megvalstsa. Ha a
msodik esetet tekintjk, akkor a sajt hibavdelmnk segtsgvel, mondjuk
valamilyen nem hasznlt visszatrsi rtkkel tudjuk a hv fl tudomsra
hozni, hogy hiba trtnt. Ez nha komoly problmkat tud okozni, hiszen pldul egy egsz rtkkel visszatr fggvny esetben nha elg krlmnyes
olyan egsz rtket tallni, amelyik nem egy lehetsges valdi visszatrsi rtk.
gy ebben az esetben is, br a fellp hibajelensg valahogy kezelhet, a kivtelkezels lehetsge nyjt elegns megoldst.
A kivtelkezels lehetsge hasonl, mint a fordtsi idben trtn
hibakeress, hibavdelem azzal a klnbsggel, hogy mindezt futsi idben
lehet biztostani. A C# kivtelkezels a hibakezelst tmogatja. Nem tmogatja
az n. aszinkron kivtelek kezelst, mint pldul billentyzet- vagy egyb hardvermegszakts (interrupt) kezelse.
Ehhez hasonl lehetsggel mr a BASIC nyelvben is tallkozhattunk (ON
ERROR GOTO, ON ERROR GOSUB). Ehhez hasonl forma jelenik meg az
Object Pascal nyelvben is (ON DO).
118
VIII. Kivtelkezels
try
catch
throw
finally
{
// azon utastsok kerlnek ide, melyek
// hibt okozhatnak, kivtelkezelst ignyelnek
}
catch( tpus [nv])
{
// Adott kivteltpus esetn a vezrls ide kerl
// ha nemcsak a hiba tpusa az rdekes, hanem az
// is,hogy pldul egy indexhiba esetn milyen
// index okozott galibt, akkor megadhatjuk a
// tpus nevt is, amin keresztl a hibt okoz
// rtket is ismerhetjk. A nv megadsa opcionlis.
}
finally {
// ide jn az a kd, ami mindenkppen vgrehajtdik
}
int i=4;
int j=0;
try
{
i=i/j;
}
// 0-val osztunk
VIII. Kivtelkezels
catch (Exception )
{
Console.WriteLine("Hiba!");
}
finally
{
Console.WriteLine("Vgl ez a Finally blokk is lefut!");
}
A fenti pldban azt lthatjuk, hogy a rendszerknyvtr hasznlatval, pldul a nullval val oszts prblkozsakor, a keretrendszer hibakivtelt generl,
amit elkapunk a catch blokkal, majd a finally blokkot is vgrehajtjuk.
A plda egsz szmokhoz kapcsoldik, gy meg kell jegyezni, hogy gyakran
hasznljk az egsz aritmetikhoz kapcsoldan a checked s az unchecked
mdostkat is. Ezek a jelzk egy blokkra vagy egy fggvnyre vonatkozhatnak.
Ha az egsz aritmetikai mvelet nem brzolhat, vagy hibs jelentst tartalmaz, akkor a checked blokkban ez a mvelet nem kerl vgrehajtsra.
Plda:
int i=System.Int32.MaxValue;
checked
{
i++;
// OverflowException kivtel keletkezik
}
int j=System.Int32.MaxValue;
unchecked
{
j++;
// OverflowException kivtel nem keletkezik
}
Console.WriteLine(i); // -2147483648 lesz a kirt rtk
// ez azonos a Syste.Int32.MinValue
// rtkvel
Termszetesen nemcsak a keretrendszer lthatja azt, hogy a normlis utastsvgrehajtst nem tudja folytatni, ezrt kivtelt generl, s ezzel adja t a
vezrlst, hanem maga a programoz is. Termszetesen az, hogy a programoz
mikor ltja szksgesnek a kivtel generlst, az r van bzva.
Plda:
int i=4;
try
VIII. Kivtelkezels
{
int i=4;
try
{
if (i>3) throw new Exception(); // ha i>3, kivtel indul
}
catch (Exception )
{
Console.WriteLine("Hibt dobtl!");
throw;
//a hiba tovbbtsa
// ennek hatsra , ha a program nem kezel tovbbi kivtel
// elkapst, a .NET keretrendszer lesz a kivtel elkapja.
// gy szabvny hibazenetet kapunk, majd a
// programunk lell
}
VIII. Kivtelkezels
akkor az Indexhibra jellemz plusz informcik nem lesznek elrhetk! Mivel
egy stpus egyben dinamikus utdtpusknt is megjelenhet, ezrt a hibakezel
blokkokat az rkls fordtott sorrendjben kell definilni.
Plda:
using System;
public class Hiba:Exception
{
public Hiba(): base()
{
}
public Hiba(string s): base(s)
{
}
}
public class IndexHiba:Hiba
{
public IndexHiba(): base()
{
}
public IndexHiba(string s): base(s)
{
}
}
int i=4;
int j=0;
try
{
if (i>3) throw new Hiba("Nagy a szm!");
}
catch (IndexHiba h )
{
Console.WriteLine(h);
}
catch (Hiba h ) // csak ez a blokk hajtdik vgre
{
Console.WriteLine(h);
}
catch (Exception )
{
Console.WriteLine("Hiba trtnt, nem tudom milyen!");
}
finally
// s termszetesen a finally is
{
Console.WriteLine("Finally blokk!");
}
VIII. Kivtelkezels
Ahogy korbban lttuk, minden objektum a keretrendszer Object utdjnak
tekinthet, ennek a tpusnak pedig a ToString fggvny a rsze, gy egy tetszleges objektum kirsa nem jelent mst, mint ezen ToString fggvny meghvst.
A fenti plda gy meghvja az Exception osztly ToString fggvnyt, ami
szvegparamter mellett kirja mg az osztly nevt s a hiba helyt is.
Befejezsl nzzk meg a korbban ltott verem plda megvalstst kivtelkezelssel kiegsztve.
Plda:
using System;
class verem
{
Object[] x;
int mut;
public verem(int db)
{
x=new object[db];
mut=0;
}
// NEM DEFINILUNK DESTRUKTORT,
// MERT AZ AUTOMATIKUS SZEMTGYJTSI
// ALGORITMUS FELSZABADTJA A MEMRIT
public void push(Object i)
{
if (mut<x.Length)
{
x[mut++]=i;
// beillesztettk az elemet
}
else throw new VeremTele("Ez bizony tele van!");
}
public Object pop()
{
if (mut>0) return x[--mut];
// ha van elem, akkor visszaadjuk a tetejrl
else throw new VeremUres("res a verem bartom!");
}
public class VeremTele:Exception
{
public VeremTele(): base("Tele a verem!")
{
}
VIII. Kivtelkezels
public VeremTele(string s): base(s)
{
}
}
public class VeremUres:Exception
{
public VeremUres(): base("res a verem!")
{
}
public VeremUres(string s): base(s)
{
}
}
class program
{
public static void Main()
{
verem v=new verem(6);
try
{
Console.WriteLine(v.pop());
// mivel a verem res, kivtelt fog dobni
}
catch (VeremUres ve)
// amit itt elkapunk
{
Console.WriteLine(ve);
}
v.push(5);
v.push("alma");
Console.WriteLine(v.pop());
}
}
11. bra
VIII. Kivtelkezels
VIII.3. Feladatok
1. Mikor is hogyan hasznljuk a kivtelkezelseket?
2. Mit jelent a checked, unchecked kulcssz, hogyan tudjuk hasznlni?
3. Hogyan tudunk sajt kivtelt (tpust) definilni?
4. Olvassa be a msodfok egyenlet paramtereit. Szmolja ki a gykket,
ha a diszkriminns negatv szm, hasznlja a rendszerknyvtr kivtelkezelsi lehetsgt!
5. Ksztsen Diszkriminns_negatv kivtelt. Oldja meg az elz feladatot
ennek segtsgvel!
IX. Input-Output
A be- s kiviteli szolgltatsok nem rszei a nyelvnek. A programok a
szabvnyos knyvtrban lv fggvnyek segtsgvel tartjk a krnyezetkkel
a kapcsolatot. Ez a fajta kapcsolattarts nem csak a C# nyelvben rt programok
sajtossga. A C++-bl szrmaztathat nyelvek hasonlan hasznljk az inputoutput mveleteket, mert gy azok egyszerbben s rugalmasabban kezelhetk.
126
IX. Input-Output
Az els rsz 0-tl kezdden egy sorszm, azt mondja meg, hogy a szveg
utni kirand adatok kzl hnyadikat kell behelyettesteni.
Ha van msodik rsz, akkor az vesszvel elvlasztva kvetkezik, s a teljes
adatszlessget hatrozza meg. Ha a szlessg pozitv, akkor az jobbra, ha negatv, akkor balra igaztst jelent az adott szlessgen bell. A hinyz karaktereket n. white space (helykz) karakterekkel tlti fel.
Ha van harmadik rsz, akkor az a kettspont utn kvetkezik, s meghatrozza az adat tpust, kijelzsi formjt. Az adattpus jelzsre az albbi karakterek hasznltak:
c
e
x
IX. Input-Output
Plda:
string s=Console.ReadLine();
Ha nem sikerl a konvertls, akkor a konvertlsi hibnak megfelel kivtelt dob a Convert osztlyfggvnye. Ezt a kivtelkezelst hasznlva szmok
beolvassra, az albbi pldt, mint egy lehetsges megvalstst tekinthetjk.
Nzzk meg a Struktrk fejezet vgn hasznlt pldnkat azzal a kiegsztssel, hogy a kor mez olvasst a konverzi kivtelfigyelsvel egsztjk ki.
Plda:
using System;
struct struktra_plda
{
public int kor;
public string nv;
}
class strukra_hasznl
{
public static void Main()
{
// struktra_plda vektor
struktra_plda [] spv=new struktra_plda[5];
int i=0;
// beolvass
while(i<5)
{
spv[i]=new struktra_plda();
Console.WriteLine("Krem az {0}. elem nevt!",i);
string n=Console.ReadLine();
spv[i].nv=n;
Console.WriteLine("Krem az {0}. elem kort!",i);
IX. Input-Output
while(true)
{
try
{
n=Console.ReadLine();
spv[i].kor=Convert.ToInt32(n);
}
catch(Exception e)
{
Console.WriteLine("Te kis csibsz, a kor az
szm!");
Console.WriteLine("Azt add meg mg egyszer! ");
continue;
}
break;
}
i++;
}
// kirs
for(i=0;i<5;i++)
{
Console.WriteLine(spv[i].nv);
Console.WriteLine(spv[i].kor);
}
}
}
IX. Input-Output
IX. Input-Output
Knyvtrakkal kapcsolatosan a Directory osztly statikus fggvnyei llnak
rendelkezsre.
Ha megnyitottunk egy binris llomnyt, akkor rsra a legfontosabb
BinaryWriter fggvnyek a kvetkezk:
Write(adat)
Flush()
Close()
Seek(mennyit, honnan)
A fjl olvassi mveletek fjl vge esetn EndOfFileException kivtelt dobnak, gy ha nem tudjuk, mennyi adat van egy llomnyban, akkor ennek
megfelelen try blokkban kell az olvasst vgezni!
Ezek utn nzznk egy rvid pldt:
using System;
using System.IO;
class fileteszt
{
private static string nev = "Test.data";
public static void Main(String[] args)
{
// j llomny ltrehozsa
if (File.Exists(nev))
{
Console.WriteLine("{0} mr ltezik!", nev);
return;
}
// FileStream ltrehozsa
FileStream fs = new FileStream(nev, FileMode.CreateNew);
// a filestream hozzrendelse binris rshoz.
BinaryWriter w = new BinaryWriter(fs);
// adatkirs.
IX. Input-Output
for (int i = 0; i < 5; i++)
{
w.Write( i);
}
w.Close();
fs.Close(); // fjlzrs
// Create the reader for data.
fs = new FileStream(nev, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
// olvass.
for (int i = 0; i < 5; i++)
{
Console.WriteLine(r.ReadInt32());
}
w.Close();
}
// karaktert beolvas.
// egsz sort beolvas
// ms alaptpusokra is ltezik
// fjlzrs
// a kvetkez karaktert kapjuk a fjlbl
// de nem mdosul a fjlpozci
IX. Input-Output
Plda:
using System;
using System.IO;
class Test
{
public static void Main()
{
StreamWriter sw = new StreamWriter("Teszt.txt");
//kirs.
sw.Write("Szia");
sw.WriteLine("EZ A FOLYTATS.");
sw.WriteLine("jabb sor.");
sw.Close();
// fjlolvass.
StreamReader sr = new StreamReader("Teszt.txt");
string sor;
// olvass soronknt, amg van adat
while ((sor = sr.ReadLine()) != null)
{
Console.WriteLine(sor);
}
}
}
IX.3. Feladatok
1. Mit jelent a standard input-output lehetsge?
2. Milyen formzsi lehetsgeket ismer?
3. Mi a klnbsg a binris s szveges fjl kztt?
4. rja ki a szmot decimlis, hexadecimlis formban balra, majd jobbra
igaztva 20 szlessgben!
5. Trolunk egy nevet s egy szmot, rjuk ki ezeket adatok .bin nvvel
binris, majd adatok.txt nvvel szveges formban!
X. Prhuzamos programvgrehajts
A feladatok gyorsabb, hatkonyabb elvgzsnek rdekben az utbbi
vekben specilis lehetsgknt jelent meg a prhuzamos programvgrehajts. Gondolhatunk a tbbfeladatos opercis rendszerekre, vagyis arra
pldul, hogy mikzben a programunkat fejlesztjk, s valamilyen szvegszerkesztt hasznlunk, a produktvabb munkavgzs rdekben, gondolkodsunkat serkentend, kedvenc zennket hallgathatjuk szmtgpnk segtsgvel.
A prhuzamos programvgrehajts programjaink szintjn azt jelenti, hogy az
opercis rendszer fel tbb vgrehajtsi feladatot tudunk definilni.
Pldul egy adatgyjtsi feladatban az egyik szl az adatok gyjtst vgzi,
a msik szl pedig a korbban begyjttt adatokat dolgozza fel.
A .NET keretrendszer, ahogy tbb ms fejleszteszkz is, lehetsget ad
arra, hogy egy program tbb vgrehajtsi szlat definiljon. Ezekrl a vgrehajtsi szlakrl az irodalomban, online dokumentciban threads, threading nven
olvashatunk.
134
X. Prhuzamos programvgrehajts
Ezek utn az els pldaprogram a kvetkezkppen nzhet ki:
Plda:
using System;
using System.Threading;
class program
{
public static void szal()
{
Console.WriteLine("Ez a szlprogram!");
}
public static void Main()
{
Console.WriteLine("A fprogram itt indul!");
ThreadStart szalmutato=new ThreadStart(program.szal);
// ltrehoztuk a fonal fggvnymutatt, ami a
// szal() fggvnyre mutat
Thread fonal=new Thread(szalmutato);
// ltrehoztuk a prhuzamos vgrehajtst vgz objektumot
// paramterl kapta azt a delegltat (fggvnyt)amit
// majd vgre kell hajtani
fonal.Start();
// elindtottuk a fonalat, valjban a szal() fggvnyt
// a fonal vgrehajtsa akkor fejezdik be amikor
// a szal fggvnyhvs befejezdik
Console.WriteLine("Program vge!");
}
}
Sleep (millisec): statikus fggvny, az aktulis szl vgrehajtsa vrakozik a paramterben megadott ideig.
Join(): az aktulis szl befejezst vrjuk meg
X. Prhuzamos programvgrehajts
Interrupt(): az aktulis szl megszaktsa. A szl objektum interrupt hvsa ThreadInterruptedException esemnyt okoz a szl vgrehajtsban.
Abort(): az aktulis szl befejezse, valjban a szlban egy
AbortThreadException kivtel dobst okozza, s ezzel befejezdik a
szl vgrehajtsa. Ha egy szlat abortltunk, nem tudjuk a Start fggvnnyel jraindtani, a start utasts ThreadStateException kivtelt dob.
Ezt a kivtelt akr mi is elkaphatjuk, s ekkor, ha gy ltjuk, hogy a
szlat mgsem kell abortlni, akkor a Thread.ResetAbort() fggvnyhvssal hatlyon kvl helyezhetjk az Abort() hvst.
IsAlive: tulajdonsg, megmondja, hogy a szl l-e
Suspend(): a szl vgrehajtsnak felfggesztse
Resume(): a felfggeszts befejezse, a szl tovbbindul
X. Prhuzamos programvgrehajts
Thread.Sleep(2000);
// vrunk 2 msodpercet
Console.WriteLine("Letelt a 2 msodperc a fprogramban,
a szlat felfggesztjk!");
fonal.Suspend();
// fonal megll
Thread.Sleep(2000);
Console.WriteLine("Letelt az jabb 2 msodperc a
fprogramban, a szl vgrehajtst folytatjuk!");
fonal.Resume();
// fonal jraindul
fonal.Join();
// megvrjuk a fonalbefejezdst
Console.WriteLine("Program vge!");
12. bra
Ha tbb szlat is definilunk, vagy akr csak egyet, mint a fenti pldban,
szksgnk lehet a vgrehajtsi szl prioritsnak lltsra. Ezt a szlobjektum
Priority tulajdonsg lltsval tudjuk megtenni az albbi utastsok valamelyikvel:.
fonal.Priority=ThreadPriority.Highest
fonal.Priority=ThreadPriority.AboveNormal
fonal.Priority=ThreadPriority.Normal
fonal.Priority=ThreadPriority.BelowNormal
fonal.Priority=ThreadPriority.Lowest
//
//
//
//
//
legmagasabb
alap fltt
alaprtelmezett
alap alatt
legalacsonyabb
X. Prhuzamos programvgrehajts
X. Prhuzamos programvgrehajts
// szl1 definils
public static void szal2()
{
Console.WriteLine("Ez a szl2 programinduls!");
// egy msodpercet vrunk
Console.WriteLine("Adatments meghvsa szal2-bl!");
a.mentes("-");
Console.WriteLine("Szl2 vge!");
}
public static void Main()
{
Console.WriteLine("A fprogram itt indul!");
ThreadStart szalmutato1=new ThreadStart(program.szal1);
ThreadStart szalmutato2=new ThreadStart(program.szal2);
// ltrehoztuk a fonal fggvnymutatt, ami a
//
Thread fonal1=new Thread(szalmutato1);
Thread fonal2=new Thread(szalmutato2);
fonal1.Start();
fonal2.Start();
//
//
Console.WriteLine("Program vge!");
}
}
13. bra
X. Prhuzamos programvgrehajts
Ebbl a futsi eredmnybl az ltszik, hogy a fonal1 s a fonal2 mentse,
azaz ugyanannak a fggvnynek a vgrehajtsa prhuzamosan trtnik!
(Csak azrt kerlt egy kis vrakozs a ciklusba, hogy szemlletesebb legyen
a prhuzamos fggvnyfuts, a + s karakterek vltott kirsa.)
A + s a karakterek vltakoz kirsa, azaz a kt fonal trzsnek vltakoz
vgrehajtsa nem jr klnsebb gonddal. De gondoljunk pldul egy olyan
esetre, amikor az adatment fggvny soros portra rja a mentsi adatokat
archivlsi cllal, vagy vezrel valamilyen eszkzt. Ekkor lnyeges az adatok
sorrendje, s ez a fajta futsi eredmny nem kielgt. Teht alapvet igny a
tbbszl vgrehajts esetn, hogy biztostani tudjuk egy fggvny, egy utasts
megszaktsmentes (ezt gyakran thread safe lehetsgnek nevezik), n. szinkronizlt vgrehajtst.
Ha egy adat mdostst, egy fggvny hvst egy idpontban csak egy
vgrehajtsi szlnak szeretnnk engedlyezni, akkor erre tbb lehetsgnk is
knlkozik. Csak a leggyakrabban hasznlt lehetsgeket emltjk, hiszen nem
tudjuk, s nem is clunk az sszes lehetsg referenciaszer felsorolsa.
Automatikus szinkronizcinak nevezi a szakirodalom azt a lehetsget, mikor egy egsz osztlyra belltjuk ezt a szolgltatst. Ehhez kt dolgot kell
megtennnk:
1. A Synchronization() attribtummal kell jellni az osztlyt. Az attribtumokkal a kvetkez fejezet foglalkozik, gy most egyszeren fogadjuk
el ezt az osztlyra, fggvnyre, vltozra llthat informcit.
2. Az osztlyt a ContextBoundObject osztlybl kell szrmaztatni.
Plda:
[Syncronization()]
class szinkronosztly: ContextBoundObject
{
int i=5;
// egy idbencsak egy szl fr hozz
public void Novel()
// ezt a fggvnyt is csak egy szl
// tudja egyszerre vgrehajtani
{
i++;
}
X. Prhuzamos programvgrehajts
Egy fggvny szinkronizlt vgrehajtst a legegyszerbben a
MethodImplAttribute attribtum belltsval rhetjk el. Ezt mind pldny,
mind pedig statikus fggvnyre alkalmazhatjuk.
[MethodImplAttribute(MethodImplOptions.Syncronized)]
public void safe_fv()
{
14. bra
X. Prhuzamos programvgrehajts
Hasonl eredmnyt kaphatunk, ha a C# nyelv lock utastsval vdjk a kvnt blokkot. Ha a fenti fggvnyt a lock nyelvi utastssal vdjk, azt a fordt
a kvetkez alakra alaktja:
Monitor.Enter(this);
try
{
utastsok;
}
finally
{
Monitor.Exit(this);
}
X. Prhuzamos programvgrehajts
Mg manulisabb adat vagy utasts szinkronizcit biztost a
ReadWriterLock, valamint az Interlocked osztly is. Ezek s a tovbbi
szinkronizcis lehetsgek ismertetse tlmutat e knyv keretein.
Ha knyvtri szolgltatsokat vesznk ignybe, pldul MSDN Help, az
egyes hvsok, osztlyok mellett olvashatjuk, hogy thread safe-e vagy nem a
hasznlata, attl fggen, hogy a szinkronizlt hozzfrs biztostott-e vagy sem.
A szlakkal kapcsolatban befejezsl meg kell emlteni a [STAThread]
illetve az [MTAThread] attribtumot, ami azt mondja meg, hogy Single (egy)
vagy Multi (tbb) szlat tartalmaz alkalmazsknt definiljuk a programunkat
COM komponensknt val egyttmkdsnl. Alaprtelmezs a [STAThread]
hasznlata, ami pldul a Windows alkalmazsok Drag and Drop jellemzk
hasznlata esetn kvetelmny is.
X.4. Feladatok
1. Mit rtnk prhuzamos programvgrehajts alatt?
2. Hogyan tudunk szlat definilni?
3. Mit jelent a lock utasts? Milyen knyvtri szolgltats felel meg ennek
az utastsnak?
4. Ksztsen programot, amely kt sket ember beszlgetst szimullja!
Mindketten egy-egy fjlban troljk a mondkjukat!
5. Hasznljunk szinkronizlst, mdostsuk az elz feladatot gy, hogy a
mondatvgeknl lehet a msik szereplnek tvenni a beszd fonalt!
XI. Attribtumok
Kpzeljk el, hogy definiltunk egy j tpust (osztlyt), minden adatnak,
fggvnymeznek elksztettk a megfelel kezelst, jelentst, hasznlatt,
azaz a tpusunk hasznlatra ksz. Mgis, egyes mezk vagy esetleg az egsz tpus mell bizonyos plusz informcikat szeretnnk hozzrendelni.
Pldaknt nzznk kt ilyen, a mindennapi programozsi feladataink sorn
is elfordul esetet!
Els plda:
Egy program ltalban tbb tpussal, adattal dolgozik. Ezek kztt az adatok
kztt lehet nhny, amelyek rtkre a program kvetkez indulsakor is
szksgnk lehet. Ezeket a program vgn elmentjk a registry-be. (A registry a
korbbi Windows ini llomnyokat vltja fel, programhoz ktd informcikat
tudunk ebben az opercis rendszerbeli adatbzisban trolni.) Termszetesen
innen be is olvashatjuk ezeket az adatokat. A programunk elvgzi ezt a mentst
is, a visszaolvasst is. Ha viszont felteszi valaki a krdst a programban, hogy
jelenleg kik azok, akiket a registry-ben is trolunk, akkor erre nincs ltalnos
vlasz! Minden programba bele kell kdolni azt, hogy melyek a mentett
adataink! Hasznos lenne, ha nem kellene ezt megtenni, csak jellhetnnk ezeket
a mezket, s ezt a jellst ksbb kikereshetnnk.
Msodik plda:
Ez a plda taln kicsit tvolabb ll az informatiktl, de nem kevsb
letszer. Definiljuk vagy nem is kell definilnunk, mert egybknt is
lteznek az emberek klnbz csoportjait! Ebbe a definciba rtsk bele a
normlis hasznlathoz szksges sszes tulajdonsgot (nem, foglalkozs,
letkor, vgzettsg, )! Emellett szksgnk lehet mondjuk egy olyan informcira, hogy pldul az illet fradidrukker-e! Termszetesen az alaptulajdonsgok kz is felvehetnnk ezt a jellemzt, de mivel ennek az adatnak a tpus
tnyleges mkdshez semmi kze nincs nem fradidrukker is vgezheti
rendesen a dolgt , ezrt ez nem lenne szerencss.
Az ilyen plusz informcik elhelyezsre nyjt lehetsget a C# nyelvben az
attribtum.
Az attribtumok olyan nyelvi elemek, melyekkel fordtsi idben
osztlyokhoz, fggvnyekhez vagy adatmezkhz informcikat rendelhetnk.
Ezek az informcik aztn futsi idben lekrdezhetk.
144
XI. Attribtumok
XI. Attribtumok
XI. Attribtumok
Ekkor a programosztlyomat szeretnm a t nev tpusler objektumon
keresztl elemezni. A kapott t objektumra megkrdezhetem pldul, hogy osztly-e:
if (t.IsClass()) Console.WriteLine("Igen");
XI. Attribtumok
hiszen gy knnyen meg lehet klnbztetni a rendes osztlyoktl. Termszetesen ebben az esetben is elhagyhatjuk az attribute szcskt a hasznlat sorn,
mert azt a fordt odarti.
Teht ekkor a fradi_szurkol attribtumosztlyt a kvetkezkppen definiljuk:
class fradi_szurkolAttribute:Attribute
{
Ezek utn megnzzk a fradi_szurkol attribtumunk definilst s hasznlatt egy kerek pldn keresztl. A plda nem hasznlja az imnti Attribute
kiegsztses defincit.
Plda:
using System;
using System.Reflection;
class fradi_szurkol:Attribute
{
private int ev;
// hny ve szurkol
private bool torzsszurkolo;
// vajon trzsszurkol-e
public fradi_szurkol(int e)
// az e rendes, pozicionlis
{
// paramter
ev=e;
}
public override string ToString()
{
string s="Ez az ember fradiszurkol!
vek szma:"+ev+"Trzsszurkol:"+torzsszurkolo;
return s;
}
// az albbi Torzsszurkol tulajdonsg nevestett
// fradi_szurkol paramter, mert publikus s van get s set
XI. Attribtumok
// rsze, amivel az adott torzsszurkolo logikai mezt llthatjuk
public bool Trzsszurkol
{
get
{
return torzsszurkolo;
}
set
{
torzsszurkolo=value;
}
}
}
class ember
{
string nev;
public ember(string n)
{
nev=n;
}
}
class adatok{} //nem fontos, hogy rdemi informcit tartalmazzon
class program
{
// attribtum belltsa
[fradi_szurkol(35)]
public ember en= new ember("Zoli");
// a norml konstruktort hvtuk meg, azok a mezk, amiket nem
// inicializl, alaprtelms szerint kerlnek belltsra
// 0, ha szm, false ha bool, illetve null, ha referencia
// Egy attribtum csak a kvetkez adat vagy fggvny vagy
// osztlyra hat!!!
// gy a kvetkez adatok tpus vltoznak nincs kze
// a fradi_szurkol attribtumhoz
//
public adatok a=new adatok();
//
[fradi_szurkol(42,Trzsszurkol=true)]
public ember te= new ember("Pali");
// Pali mr trzsszurkol
public static void Main()
{
XI. Attribtumok
program p=new program();
Console.WriteLine("A fprogram itt indul!");
Type t=Type.GetType("program");
foreach( FieldInfo mezo in t.GetFields())
{
Console.WriteLine(mezo.FieldType);
// meztpus kirsa
Console.WriteLine(mezo.Name);
// meznv krsa
if ((mezo.GetCustomAttributes(true)).Length>0)
{
foreach (Attribute at in mezo.GetCustomAttributes(true))
{
// megnzzk fradiszurkol-e
fradi_szurkol f=at as fradi_szurkol;
if (f!=null) // igen ez a mez fradiszurkol
Console.WriteLine(at.ToString());
}
}
else
Console.WriteLine("Ez az adat nem rendelkezik
attribtummal!");
}
Console.WriteLine("Program vge!");
}
}
15. bra
XI. Attribtumok
System.ConditionalAttribute: Egy szveg a paramtere. Csak fggvnyhez kapcsolhatjuk, s az a fggvny, amihez kapcsoltuk csak akkor
hajtdik vgre, ha a paramterl adott szveg definilt.
Plda:
[Conditional("alma")]
void almafuggveny()
{
Console.WriteLine("Alma volt!");
}
#define alma
almafuggveny();
// hvs rendben
#undefine alma
almafuggveny();
// hvs elmarad
XI. Attribtumok
A feltteles vgrehajts fggvnyek ktelezen void visszatrsek, s
nem lehetnek virtulisak, vagy override jelzvel elltottak! Ezeket a
kirtkelseket az elfordt nzi vgig.
System.ObsoleteAttribute: egy zenet(szveg) a paramtere, ha egy fggvny elavult, s javasolt a mellzse, akkor hasznlhatjuk.
XI.4. Feladatok
1. Mi az attribtum, hogy tudjuk hasznlni?
2. Hogyan definilhatunk sajt attribtumot?
3. Mi a klnbsg a rendes s nevestett attribtum paramter kztt?
4. Ksztsnk Hisz_e_a_mesben attribtumot! Definiljuk az ember
osztlyt, majd alkalmazzuk az attribtumot egyes 'pldnyaira'!
Mdostsuk az elz attribtumot gy, hogy meg tudjuk adni azt az idt
amilyen rgta hisz valaki a mesben!
153
16. bra
System;
System.IO;
System.Runtime.Serialization;
System.Runtime.Serialization.Formatters.Binary;
System.Runtime.Serialization.Formatters.Soap;
System;
System.IO;
System.Runtime.Serialization;
System.Runtime.Serialization.Formatters.Binary;
System.Runtime.Serialization.Formatters.Soap;
[Serializable]
// az attribtum hatsra a formz lekezeli a tpus szerializcijt
class ember
{
string nev;
int kor;
public ember(string n, int k)
{
nev=n; kor=k;
}
}
class serprog
{
// program adatai
int i=2;
double d=3.5;
string s="fradi";
// a sajt tpus hasznlata
ember e=new ember("Zoli", 34);
public static void Main()
{
serprog p=new serprog();
//fjlstream ltrehozsa
FileStream fb=File.Create("ser.bin");
// Binaryformatter kszts
FileStream fs=File.Create("ser.txt");
BinaryFormatter b=new BinaryFormatter();
SoapFormatter so=new SoapFormatter();
//Binris ments
b.Serialize(fb,p.i);
b.Serialize(fb,p.d);
//fjl lezrsa
fb.Close();
fs.Close();
[Serializable]
// az attribtum hatsra a formz lekezeli a tpus szerializcijt
class ember:ISerializable
// az interface kt plusz fggvnydefincit r el
{
string nev;
int kor;
public ember(string n, int k)
{
nev=n; kor=k;
}
internal ember(SerializationInfo si, StreamingContext st)
{
// elemek visszalltsa
nev=si.GetString("nev");
kor=si.GetInt32("kor");
}
XII.3. Feladatok
1. Mit neveznk szabvnyos mentsnek?
2. Milyen hasonl megvalstsokat ismer ms fejleszt rendszerben?
3. Milyen szabvnyos mentseket tmogat a fejleszt rendszer?
4. A msodfok egyenlet (VIII.3. fejezet 4. feladat) adatait mentsk el binris formban!
5. Definiljunk egy szurkol osztlyt (nv, kedvenc_csapat), s biztostsuk
ennek a tpusnak szabvnyos menthetsgt!
159
// Kirjuk az elemeket
Console.WriteLine( "A bvtett ArrayList a kvetkez
elemeket tartalmazza:" );
PrintValues( elemek );
A fenti forrskdot teszleges szvegszerkesztbe berva, az albbi parancssor segtsgvel lefordthat. (A keretrendszer mindegyik fordtja indthat
parancssorbl.)
vbc /target: library /out:DllDemo Demo.vb
System.Console.WriteLine("Program vge!");
System.Console.ReadLine();
return 0;
public golkiraly() {
sportag = "foci";
Console.WriteLine("Glkirly szerver aktivlva");
}
17. bra
Termszetesen a szerverablakban lthat eredmny a szemlletessget szolglja, a vals alkalmazsok (mivel nem is futnak nll ablakban) nem rogatnak
semmit a kpernyre.
A korbbi feladathoz hasonl kliens-szerver alkalmazsksztsi lehetsget
is biztost a keretrendszer, gynevezett WebRequest, WebResponse modellt hasznlva, vagy a klasszikus TCP, UDP protokollok hasznlatval (TcpListener,
TcpClient, UdpClient). Az osztlyok a System.Net nvtrben tallhatk. A
System.Net sszes szolgltatsa a System.Net.Sockets nvtr szolgltatsaira
pl. A System.Net.Sockets nvtr a WinSock32 API megvalstsa. Ezen
hlzati alkalmazsok ksztsnek lehetsge tlmutat e knyv keretein, gy
nem is rszletezzk azokat.
System;
System.Collections;
System.ComponentModel;
System.Data;
System.Diagnostics;
System.Web;
System.Web.Services;
namespace WebService1
{
/// <summary>
/// Summary description for Service1.
/// </summary>
public class Service1 : System.Web.Services.WebService
{
public Service1()
{
InitializeComponent();
}
//Component Designer generated code
[WebMethod]
public string Ki_a_bajnok(int ev)
{
}
}
18. bra
using System;
namespace webhasznal
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// a webreferencia neve localhost
//
localhost.Service1 s=new localhost.Service1();
Console.WriteLine(s.Ki_a_bajnok(2004));
}
}
19. bra
20. bra
XIII.4. Feladatok
1. Milyen rendszer knyvtri tpusokat ismer?
2. Mi a klnbsg a rendszer knyvtri s a web knyvtr szolgltats
kztt?
3. Mit neveznk szinkron, illetve aszinkron knyvtri hvsnak?
4. rjon programot, amely egy listban trolja a kifizetett telefonszmlk
sszegt! Valstsa meg a beolvasst, kirst fggvnyknt!
5. Ksztsen WebService-t, amely egy adott nvrl eldnti, hogy olimpiai
bajnok neve-e!
XIV. Az elfeldolgoz
XIV.1. Szimblumdefinci hasznlata
#define nv
Plda:
#define menu_h
#undef nv
Pldul az imnt definilt ALMA azonost esetben:
Plda:
#undef ALMA
174
XIV. Az elfeldolgoz
21. bra
A fenti kpen az ember osztly tartalmt ltjuk, mg a tbbi egysgt (adatok, program) nem, azokat csak jelli a szvegszerkeszt, hogy lteznek, de
pillanatnyilag nem rdekesek. Ez a segtsg nagyobb llomnyok szerkesztsnl hasznos, hiszen a szerkesztablakban jobban a lnyegre tudunk figyelni.
Ezt a szolgltatst egszti ki a
#region alma
osztlyok, fggvnyek helye
#endregion alma
XIV. Az elfeldolgoz
XIV.4. Hibazenet
Ha mr az elfordt felfedez valamilyen hibt, akkor hibazenetet ad, s
befejezi az elfordtst.
A vezrldirektva formja:
#error hibaszveg
Plda:
#ifndef c#
#error Sajnos nem a megfelel fordtt hasznlja!
#endif
XIV.5. Feladatok
1. Mik az elfordt jellemz szolgltatsai?
2. Hogy definilhatunk s szntethetnk meg egy azonostt?
3. Mit jelent a rgi definci?
4. Az eddig elksztett programjait mdostsa rgi defincikkal! Figyelje
meg, hogy mennyivel ttekinthetbb vlt a programjnak a kdja!
5. Definilja gy a msodfok egyenletet megold fggvnyt, hogy csak
akkor fordtsuk le, ha szksges!
177
22. bra
23. bra
XV.3. Feladatok
1. Mit jelent a nem felgyelt kd (unsafe)?
2. Hogyan tudunk Win32 API fggvnyt meghvni?
3. Mi a fixed vltoz?
4. Hogyan hasznlhatunk mutatkat egy C# programban?
5. Ksztsen unsafe fggvnyt, amelyik a paramter vektort nagysg
szerint sorbarendezi!
180
24. bra
25. bra
26. bra
27. bra
28. bra
29. bra
A Windows Form megoldshoz hasonlan ksztsk el a msodfok egyenlet megoldst ebben a krnyezetben is. Ehhez els lpsknt alaktsuk ki a
programunk fellett az elz pldhoz hasonlan, majd a nyomgomb esemnykezel fggvnyt definiljuk.
System;
System.Collections;
System.ComponentModel;
System.Data;
System.Drawing;
System.Web;
System.Web.SessionState;
System.Web.UI;
System.Web.UI.WebControls;
System.Web.UI.HtmlControls;
namespace webmasodfok
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.Label Label2;
protected System.Web.UI.WebControls.Label Label3;
protected System.Web.UI.WebControls.Label Label4;
protected System.Web.UI.WebControls.TextBox a;
protected System.Web.UI.WebControls.TextBox b;
protected System.Web.UI.WebControls.TextBox c;
protected System.Web.UI.WebControls.Label megoldas;
protected System.Web.UI.WebControls.Button Button1;
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET
Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
<summary>
Required method for Designer support - do not modify
the contents of this method with the code editor.
</summary>
30. bra
XVI.3. Feladatok
1. Mi a feladata a grafikus alkalmazs Main fggvnynek?
2. Mi a klnbsg a Windows s az ASP.NET alkalmazs kztt?
3. Milyen feltteleknek kell teljeslni ahhoz, hogy ASP.NET alkalmazst
tudjunk kszteni?
4. Ksztsen alkalmazst, amely egy tglatest 3 oldalt beolvasva meghatrozza a trfogatt s felsznt! (Hasznljon cmkket s szvegmezket!)
5. Ksztse el az elz feladatot webes alkalmazsknt is.
Irodalomjegyzk
1.
2.
3.
4.
5.
6.
7.
8.
9.
190