programozas csharp nyelven konyv
Post on 10-Oct-2015
50 Views
Preview:
DESCRIPTION
TRANSCRIPT
-
5/20/2018 Programozas Csharp Nyelven Konyv
1/200
11
-
5/20/2018 Programozas Csharp Nyelven Konyv
2/200
ILLS ZOLTN
Programozs C# nyelven
JEDLIK OKTATSI STDIBudapest,2005
-
5/20/2018 Programozas Csharp Nyelven Konyv
3/200
I. Alapismeretek
Minden jog fenntartva. Ezt a knyvet vagy annak rszleteit a kiad engedlye nlkl brmilyenformban vagy eszkzzel reproduklni, trolni s kzlni tilos.
A knyv ksztse sorn a kiad s a szerza legnagyobb gondossggal jrt el. Az esetlegeshibkat s szrevteleket a jos@jos.hu e-mail cmen szvesen fogadjuk.
Szakmailag ellenrizte: Heizlern Bakonyi Viktria, ELTE
Anyanyelvi lektor: Gulysn Felkai gnes
Bort: Sarkadi Csaba, 2004
Kiad: Jedlik Oktatsi Stdi Bt.1212 Budapest, Tncsics M. u. 92.Internet: http://www.jos.huE-mail: jos@jos.huFelels kiad: a Jedlik Oktatsi Stdi Bt. cgvezetje
Nyomta: LAGrade Kft.Felels vezet: Szutter Lnrd
ISBN: 963 86514 1 5Raktri szm: JO 0331
-
5/20/2018 Programozas Csharp Nyelven Konyv
4/200
Bevezet ................................................................................................... 11
I. Alapismeretek ....................................................................................... 13I.1. A nyelv trtnete............................................................................ 13I.2. A nyelv jellemzi........................................................................... 13I.3. A .NET krnyezet ttekintse........................................................ 15I.4. A program szerkezete .................................................................... 16I.5. Parancssori krnyezet hasznlata................................................... 20I.6. A krnyezet hasznlata .................................................................. 21I.7. Windows alkalmazsok ksztse.................................................. 25I.8. Feladatok........................................................................................ 27
II. A C# nyelv alaptpusai ........................................................................ 28II.1. Vltozk definilsa ..................................................................... 28II.2. llandk definilsa..................................................................... 29II.3. Vltozk inicializlsa.................................................................. 29II.4. Elemi tpusok................................................................................ 30II.5. Felsorols tpus............................................................................. 35II.6. Feladatok ...................................................................................... 37
III. Kifejezsek, mveletek ...................................................................... 38III.1. Egyoperandus opertorok.......................................................... 38
III.2. Ktoperandus opertorok .......................................................... 39III.3. Hromoperandus opertor......................................................... 42III.4. Ktoperandus rtkad opertorok............................................ 43III.5. Feladatok..................................................................................... 46
IV. sszetett adattpusok.......................................................................... 47IV.1. Tmbk....................................................................................... 47IV.2. Struktra...................................................................................... 51IV.3. Feladatok..................................................................................... 54
V. Utastsok............................................................................................ 56
V.1. sszetett utasts .......................................................................... 56V.2. Kifejezs utasts.......................................................................... 56V.3. Elgazs utasts........................................................................... 57V.4. Ciklus utasts............................................................................... 59V.5. Ugr utastsok............................................................................. 63V.6. Feladatok ...................................................................................... 67
VI. Fggvnyek........................................................................................ 68VI.1. A fggvnyek paramtertadsa ................................................. 68VI.2. A Main fggvny paramterei .................................................... 72
VI.3. Fggvnyek vltoz szm paramterrel.................................... 74
-
5/20/2018 Programozas Csharp Nyelven Konyv
5/200
I. Alapismeretek
VI.4. Fggvnynevek tdefinilsa...................................................... 75VI.5. Delegltak, esemnyek................................................................ 77
VI.6. Feladatok..................................................................................... 80VII. Osztlyok.......................................................................................... 81VII.1. Osztlyok definilsa................................................................. 82VII.2. Konstruktor- s destruktor fggvnyek ..................................... 84VII.3. Konstans, csak olvashat mezk............................................... 92VII.4. Tulajdonsg, index fggvny..................................................... 94VII.5. Osztlyok fggvnyparamterknt ............................................ 97VII.6. Opertorok jradefinilsa......................................................... 98VII.7. Interface definilsa................................................................. 104
VII.8. Osztlyok rkldse............................................................... 107VII.9. Vgleges s absztrakt osztlyok .............................................. 110VII.10. Virtulis tagfggvnyek, fggvnyelfeds ............................ 112VII.11. Feladatok................................................................................ 117
VIII. Kivtelkezels ............................................................................... 118VIII.1. Kivtelkezels hasznlata....................................................... 118VIII.2. Sajt hibatpus definilsa...................................................... 121VIII.3. Feladatok ................................................................................ 125
IX. Input-Output..................................................................................... 126
IX.1. Standard input-output................................................................ 126IX.2. Fjl input output ..................................................................... 129IX.3. Feladatok................................................................................... 133
X. Prhuzamos programvgrehajts....................................................... 134X.1. Szlak definilsa....................................................................... 134X.2. Szlak vezrlse ......................................................................... 135X.3. Szlak szinkronizlsa................................................................ 138X.4. Feladatok .................................................................................... 143
XI. Attribtumok.................................................................................... 144
XI.1. Attribtumok definilsa........................................................... 145XI.2. Attribtumok hasznlata ........................................................... 146XI.3. Knyvtri attribtumok............................................................. 151XI.4. Feladatok................................................................................... 152
XII. Szabvnyos adatments .................................................................. 153XII.1. Knyvtri tpusok szabvnyos mentse................................... 153XII.2. Sajt tpusok szabvnyos mentse........................................... 155XII.3. Feladatok.................................................................................. 158
XIII. Knyvtrak, tvoli s web knyvtrak.......................................... 159
XIII.1. Helyi knyvtrak hasznlata .................................................. 159
-
5/20/2018 Programozas Csharp Nyelven Konyv
6/200
XIII.2. Tvoli knyvtrhvs.............................................................. 162XIII.3. Webknyvtrak hasznlata..................................................... 168
XIII.4. Feladatok ................................................................................ 173XIV. Az elfeldolgoz........................................................................... 174XIV.1. Szimblumdefinci hasznlata ............................................. 174XIV.2. Terleti jells........................................................................ 175XIV.3. Feltteles fordts ................................................................... 176XIV.4. Hibazenet.............................................................................. 176XIV.5. Feladatok................................................................................ 176
XV. Nem felgyelt kd hasznlata ........................................................ 177XV.1. Nem felgyelt knyvtr elrse............................................... 177
XV.2. Mutatk hasznlata.................................................................. 178XV.3. Feladatok ................................................................................. 179XVI. Grafikus alkalmazsok alapjai ...................................................... 180
XVI.1. Windows alkalmazsok alapjai .............................................. 180XVI.2. Webes alkalmazsok alapjai .................................................. 185XVI.3. Feladatok................................................................................ 189
Irodalomjegyzk..................................................................................... 190
-
5/20/2018 Programozas Csharp Nyelven Konyv
7/200
11
Bevezet
Valamilyen programot megrni nem nehz, de j programot rni bizony nemegyszerfeladat.
Nehz lenne megmondani, hogy melyik az aranyt, amely a j program-kszts iskoljnak tekinthet, de az bizonyosan llthat, hogy j s hatkony
programot csakis megfelelfejlesztsi 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 nejelentennek valamilyen jdonsgot, legyen az hardver, vagy szoftver.A szoftver fejlesztsi krnyezeteket tekintve az utbbi idk egyik leg-
nagyobb s legtbb jdonsgot hoz egysgcsomagjt kaptk meg a fejlesztkaz j Microsoft .NET rendszerrel. Ebben a krnyezetben, brmilyen terletregondolunk, 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 tekinthetBasic s C++ nyel-
vek mellett megjelent az j C# (ejtsd: angolosan sz srp, magyarosan
C kettskereszt, Cisz) programozsi nyelv a .NET rendszer rszeknt.A nyelv mottjnak taln a kvetkezkpletet tekinthetjk:
A Basic egyszersge + a C++ hatkonysga = C#!
Ebben a knyvben a fejlesztsi eszkztrnak ezt az alapjt, a C# programo-zsi nyelvet, annak lehetsgeit ismerhetik meg.
Terveim szerint egy kvetkezknyvben a nyelv legfontosabb krnyezetbelialkalmazsi lehetsgeit rszletesen trgyalni fogjuk.
Remlem, hogy ez a knyv szles olvastbornak fog hasznos informcikatnyjtani. A programozssal most ismerkedknek egy j vilg j eszkzt mu-
tatja meg, mg a programozsban jrtas Olvask taln ennek a knyvnek asegtsgvel megrzik azt, hogy ez az a nyelv, amit kerestek.
Befejezsl remlem, hogy a magyarzatokhoz mellkelt pldaprogramokjl szolgljk a tanulsi folyamatot, s az anyag szerkesztse folytn nem kerl-tek bele nemkvnatos elemek.
Vgl, de nem utolssorban meg kell ksznnm felesgemnek e knyvolvashatsgt segtmunkjt.
Ills Zoltn
-
5/20/2018 Programozas Csharp Nyelven Konyv
8/200
I. Alapismeretek
-
5/20/2018 Programozas Csharp Nyelven Konyv
9/200
13
I. Alapismeretek
I.1. A nyelv trtnete
A C# programozsi nyelv a Microsoft j fejlesztsi krnyezetvel, a2002-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 hosz-szabb fejlesztsi idre volt szksg, mint ms nyelvekben, pldul a MS VisualBasic esetn. A C, C++ nyelv komplexitsa, a fejlesztsek hosszabb idciklusaazt eredmnyezte, hogy a C, C++ programozk olyan nyelvet keressenek, ame-lyik jobb produktivitst eredmnyez, ugyanakkor megtartja a C, C++ hatkony-sgt.
Erre a problmra az idelis megolds a C# programozsi nyelv. A C# egymodern objektumorientlt nyelv, knyelmes s gyors lehetsget biztostvaahhoz, hogy .NET keretrendszer al alkalmazsokat ksztsnk, legyen az akrszmols, akr kommunikcis alkalmazs. A C# s a .NET keretrendszer alapja
a Common Language Infrastructure(CLI).
I.2. A nyelv jellemzi
A C# az j .NET keretrendszer bzisnyelve. Tipikusan ehhez a keretrend-szerhez terveztk, nem vletlen, hogy a szabvnyostsi azonostjuk is csak egyszmmal tr el egymstl. A nyelv teljesen komponens orientlt. A fejlesztkszmra a C++ hatkonysgt, s a Visual Basic fejleszts gyorsasgt, egysze-rsgt tvztk ebben az eszkzben.
A C# nyelv legfontosabb elemei a kvetkezk: Professzionlis, Neumann-elv. Nagy programok, akr rendszerprogra-
mok rsra alkalmas. A program tbb fordtsi egysgbl modulbl vagy fjlbl ll. Minden
egyes modulnak vagy fjlnak azonos a szerkezete. Egy sorba tbb utasts is rhat. Az utastsok lezr jele a pontosvessz
(;). Minden vltozt deklarlni kell. Vltozk, fggvnyek elnevez-sben az kezetes karakterek hasznlhatak, a kis- s nagybetk kln-
bzek.
-
5/20/2018 Programozas Csharp Nyelven Konyv
10/200
I. Alapismeretek
A keretrendszer fordtsi parancsa parancssorbl is egyszeren hasznl-hat. (pl. csc /out:alma.exe alma.cs).
Minden utasts helyre sszetett utasts (blokk) rhat. Az sszetettutastst 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 t-
pust (int) csomagolhatunk objektumba (boxing) illetve vissza(unboxing).
Fggvnyek defincii nem gyazhatk egymsba, nmagt meghvhatja(rekurzi). Teht fggvnydefinci esetn nincs blokkstruktra. Blok-
kon bell statikus vagy dinamikus lettartam vltozk deklarlhatk.Fggvnypolimorfizmus megengedett.
rtk, referencia (ref) s output (out) fggvnyparamterek. Kezd paramter-rtkads, vltoz paramterszm fggvny deklar-
lsa.
Delegltak, esemnyek hasznlata. Hierarchikus nvterekben hasznlt osztlyok. Mivel minden osztly, ezrt
a program, aMainfggvny publicstatichozzfrs. Tbb osztly istartalmazhat Main fggvnyt, de ilyen esetben a fordtskor meg kellmondani, hogy melyik osztlybeliMainfggvny legyen az aktulis in-dul (/main:osztlynv).
j opertorok: isopertor egy objektum tpust ellenrzi (x is Labda),asopertor a bal oldali operandust jobb oldali tpuss konvertlja (Labdal = x as Labda;).A hagyomnyos konverzis opertortl abban kln-
bzik, hogy nem generl kivtelt! Privt konstruktor (nem akarunk egy pldnyt se), statikus konstruktor
(statikus mezk inicializlsa, mindig pldny konstruktor eltt hvdikmeg, futsi idben az osztlybetlthvja meg) hasznlata.
Nincs destruktor, helyette a keretrendszer szemtgyjtsi algoritmusa van.
Szksg esetn az osztlyDisposemetdusa jradefinilhat.
Egyszeres rkls, interface-ek hasznlata. Opertorok definilsnak lehetsge,property, indexerdefinils. Kivtelkezels megvalstsa. Prhuzamos vgrehajts szlak definilhatsga.
-
5/20/2018 Programozas Csharp Nyelven Konyv
11/200
I. Alapismeretek
I.3. A .NET krnyezet ttekintse
A Visual Studio 6.0 fejleszt
rendszer tdolgozsaknt 2002-ben jelent meg aMicrosoft legfrissebb fejleszteszkze. Utalva a lnyeges vltoztatsokra, ahlzati munka integrlsra, a fejleszteszkz a Visual Studio.NET nevetkapta. Jelenleg az eszkz 2003-as frisstse a legutols verzi. A knyvszempontjbl nincs lnyeges klnbsg a kt verzi kztt, gy nem is trnkki a klnbsgek bemutatsra.
Az j eszkz a korbbi fejlesztrendszerekkel ellenttben nem a hagyom-nyosnak tekinthet n. Win32 alap, hanem a .NET krnyezet alatt futtathatalkalmazsokat kszt. Ez azt jelenti, hogy az j eszkzzel kszlt alkalmazsokcsak olyan opercis rendszer alatt futtathatk, melyek tmogatjk a .NET
keretrendszert (.NET Framework). Alaprtelmezsknt a jelenlegi opercisrendszerek egyike sem tmogatja ezt, viszont Windows 98 opercis rendszertlfelfel utlag feltelepthet. A fordt a forrskdot nem natv, hanem egy kz-tes kdra fordtja le. Ezt a kztes kdot MSIL (Microsoft IntermediateLanguage) nven szoktk emlteni.
A Visual Studio.NET teleptse teht a keretrendszer teleptsvel kezddik.
A .NET keretrendszer legfontosabb ernyei: Webszabvnyokon alapul (XML, HTML, SOAP).
Univerzlis alkalmazsi modellt hasznl, azaz egy .NET osztly, szolgl-
tats tetszleges .NET kompatibilis nyelvbl hasznlhat. A .NET kom-patibilitst a Common Language Specification (CLS) definilja.
Minden nyelvbl ugyanazok a tpusok hasznlhatk (Common TypeSystem)
Minden .NET osztly a fejlesztk rendelkezsre ll.
A keretrendszer a fejleszteszkz szmra fordtsi idej szolgltatsokatvgez, mg az gy lefordtott alkalmazsoknak futsi idej krnyezetet biztost(Common Language Runtime). A keretrendszer biztostja a fentiek mellett azalkalmazsok szmra a mr nem hasznlt objektumok memriabeli felszabad-tst (Garbage Collection).
A keretrendszer osztlyknyvtra az alkalmazsok tpusa alapjn tbb cso-portba oszthat:
ADO.NET, adatbzis alkalmazsok j genercis knyvtra. ASP.NET, webes alkalmazsok (Web Forms) ksztsnek knytra. XML Web Service, interneten keresztl elrhetknyvtr. Windows alap felhasznli (Windows Forms, Console Application),
alkalmazi knyvtr.
-
5/20/2018 Programozas Csharp Nyelven Konyv
12/200
I. Alapismeretek
Az osztlyknyvtrak hasznlathoz egy fejleszt nyelvre van szksg. AVisual Studio.NET alaprtelmezsben hrom nyelvet biztost a fejlesztk sz-mra. A Visual Basic s a Visual C++ nyelveket, mint az eld keretrendszerblmegmaradt bzisnyelveket, s egy j nyelvet, amit a .NET keretrendszerhezfejlesztettek ki, a Visual C#-ot. Ma mr a Java utdnyelv, a J# is a VisualStudio.NET 2003 fejlesztrendszer rsze. Az j C# nyelvet szabvnyostottk,ami a szleskr elterjedsnek fontos felttele. A C# nyelv szabvnyostottdokumentcijhoz ECMA-334 kd alatt frhetnk hozz.
A .NET keretrendszer lnyege, hogy a kzs nyelvi defincik mr szabv-nyostottak. Ebben a szabvnyostsban a Microsoft mellett az informatikbanrdekelt legnagyobb szervezetek is (HP, Intel, IBM, Sun, Fujitsu, Netscape)
rszt vettek. Ez ECMA-335-s azonostval, mint a kzs nyelvi infrastruktravagy eredeti nevn Common Language Infrastucture (CLI) nemzetkziszabvnyv vlt.
I.4. A program szerkezete
Egy C# program tetszleges szm fordtsi egysgbl (modulbl) llhat.Szoks ezen modulok vagy fjlok sszessgt projektnek nevezni.
A program ezen modulokban definilt osztlyok sszessge.Egy fjl tartalmazza az egyes modulok kzti hivatkozsokat (using), osz-
tlytpus-, vltoz- s fggvnydeklarcikat.Egy modul egy tetszleges nvtr rsze lehet. A nvtr (namespace) az a
logikai egysg, amiben az azonostnknak egyedinek kell lennie. Nem kteleza nvtr definilsa, ebben az esetben az n. nv nlkli nvtr rsze lesz azadott kd.
Nvtr szerkezete:
namespace j_nvtrnv{
class j_osztlynv{
Tpusdefinci;Fggvnydefinci;
}}
-
5/20/2018 Programozas Csharp Nyelven Konyv
13/200
I. Alapismeretek
Fggvnyek defincijnak formja:
visszaadott_tpus nv(argumentumlista, ha van){vltoz defincik,deklarciks utastsok
}
Az osztlyok egyikben kell egyMainnevfggvnynek szerepelnie, amelyfuttatskor az opercis rendszertl a vezrlst megkapja. A nyelv megengedi,hogy tbb tpusban (osztlyban) is definiljunk ilyen fggvnyt. Ebben az eset-
ben fordtskor kell megmondani, hogy melyik tpusMain fggvnye legyen afprogram.A programban hasznlt neveknek betvel vagy _ jellel kell kezddnik,
majd a msodik karaktertl tetszleges bet s szm kombincija llhat. Anyelvben a kis- s nagybetk klnbzek, gy pldul a kvetkezkt nv semazonos:
almaaLma
Az azonostnevek hossza ltalban 32 karakter lehet, de sok rendszerben azignyeknek megfelelen lehet ezen vltoztatni.
A .NET keretrendszer 16 bites unikd karakterbrzolst hasznl, amiben amagyar 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 kulcs-szavak vagy vdett azonostk:
abstract as base bool breakbyte case catch char checkedclass const continue decimal defaultdelegate do double else enumevent explicit extern false finallyfixed float for foreach gotoif implicit in int interfaceinternal is lock long namespacenew null object operator outoverride params private protected public
-
5/20/2018 Programozas Csharp Nyelven Konyv
14/200
I. Alapismeretek
readonly ref return sbyte sealedshort stackalloc static string structswitch this throw true trytypeof uint ulong unchecked unsafeushort using virtual void while
Egy forrsllomny szerkesztse sorn magyarzatokat is elhelyezhetnk a/* s */ jelek kztt. Az ilyen megjegyzs tbb soron t is tarthat. Egy soronbell a//jel utn rhatunk magyarzatot.
A mai fejlesztkrnyezetekben egyltaln nem ritka, hogy valamilyenspecilis megjegyzst arra hasznljanak fel, hogy ennek a programszvegbltrtn kigyjtsvel a forrsllomnynak vagy magnak a programnak egy
dokumentcijt kapjk. Ezt a kigy
jtst a fordt vgzi el.A C# fordtnak ha a /doc:fjlnvformban adunk egy fordtsi paramtert,akkor /// karakterek utni informcikat XML fjlba (a megadott nvvel) ki-gyjti. Ha nem parancssori fordtt hasznlunk, ami a Visual Studio.NETkrnyezet hasznlatakor gyakran (majdnem mindig) elfordul, akkor ezt a
belltst a projekt Tulajdonsgok dialgusablakban az XML DocumentationFileparamter rtkeknt llthatjuk be.
1. bra
Ha a keretrendszerben egy vltoz vagy fggvny defincija el beszrjuk a/// karaktereket, akkor azt a szvegszerkeszt automatikusan kiegszti a k-vetkezformban:
-
5/20/2018 Programozas Csharp Nyelven Konyv
15/200
I. Alapismeretek
Plda:
///
/// ez egy vltoz/// int i;/// /// ez meg egy fggvny/// /// public void szamol(int i){
}
A/** .*/forma is megengedett, szintn dokumentcis clokra. Mivel azelzmdszer nem gyjti ki az ilyen formj megjegyzst, nem is hasznljkgyakran.
Ezek alapjn nzzk meg a szoksosnak nevezhet bevezet programunkforrskdjt.
Plda:
using System;class foci
{static void Main(){
Console.WriteLine("Hajr Fradi!");}
}
Programunk rvid magyarzataknt annyit mondhatunk, hogy a forrsk-dunk a legegyszerbb esetben egyetlen llomnybl ll, amiben nem definilunknvteret, hanem csak egy foci osztlyt. (Valamilyen tpust kell definilnunk!)
Ebben az osztlyban egyetlen fggvnyt definilunk, a programot jelentMainfggvnyt. Mivel egyetlen osztlytpus egyetlen pldnya sem ltezik a ltre-hozsig (a definci mg nem ltrehozs!), ezrt ahhoz, hogy a fggvnynk pl-dny nlkl is ltezzen, a staticjelzvel kell a hozzfrsi szintet meghatrozni.A C stlus nyelvek hagyomnyaknt a C# nyelvnek sem rszei a beolvas skir utastsok, gy knyvtri szolgltatsokra kell hagyatkoznunk, ami aSystemnvtr rsze, s ennek a nvtrnek a Consoleosztlya biztostja a klasszi-kus kpernyre rs, Console.WriteLine()s billentyzetolvass, Console.ReadLine()feladatt.
-
5/20/2018 Programozas Csharp Nyelven Konyv
16/200
I. Alapismeretek
I.5. Parancssori krnyezet hasznlata
A tetszleges szvegszerkesztvel megrt forrskdot egy alma.cs(a nyelva cs kiterjesztst szereti) fjlba menthetjk, majd az albbi utastssal for-dthatjuk le:
csc alma.cs
A fordts eredmnye egy alma.exellomny lesz, amit futtatva a kpernykvetkez sorban lthatjuk kedvenc buzdt mondatunkat. Termszetesenakkor kapunk hibamentes fordtsi eredmnyt, ha a fordtnk s a knyvtrak
hasznlathoz szksges tvonali, krnyezeti vltoz belltsok helyesek. Ezt avcvars32.bat llomny elvgzi. Ilyen parancssori krnyezetet legknnyebben aVisual Studio.NET programcsoportbeli segdeszkzk kzl tudunk elindtani.(Ekkor lefut a vcvars32.bat, nem kell neknk kzzel indtani!)
2. bra
A parancssori fordtnak a /?paramterrel trtnfuttatsa, mint egy segt-sg 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 knyv-
tri llomnyt kell hozzfordtani, akkor az llomnynevek kz vesszt kelltenni.
/main:osztlynv a nyelv megengedi, hogy tbb osztly is tartalmazzonMainfggvnyt, ekkor ezzel a kapcsolval mondhatjuk meg, hogy a sok Mainfggvny kzl melyik legyen a fprogram.
-
5/20/2018 Programozas Csharp Nyelven Konyv
17/200
I. Alapismeretek
A keletkezett exe llomnyrl el kell mondani, hogy annak futtatshoz nemelegendegy hagyomnyos 32 bites Microsoft opercis rendszer, gyakran eztgy fogalmazzk meg, hogy a keletkezett program nem natv kdot tartalmaz,hanem szksges az opercis rendszerhez hozztelepteni a .NET keretrend-szert! Ezt termszetesen a Visual Studio.NET installlsa elvgzi, gy a sajtgpnkn nem tnik fel annak hinya sem. Az irodalom ezt az exe kdot gyak-ran menedzselt (managed) kdnak nevezi.
ltalban elmondhat, hogy az j fejlesztkrnyezet minden egyesnyelvi eszkze olyan kdot fordt, aminek szksge van erre akeretrendszerre. Termszetesen mint az let minden terletn, gy itt is van-nak kivtelek. Ilyen kivtel pldul a C++ nyelv, ahol alaprtelmezs szerintmeg kell mondani, hogy a programunkat menedzselt vagy natv kdra
fordtsa-e a fordtnk. Natv kd alatt rtjk azt a fordtott eredmnyt, amiprocesszor szintutastsokat tartalmaz. Ebben a fejlesztkrnyezetben ezt akdot a menedzselt ellentteknt, nem menedzselt (unmanaged) kdnak isnevezik.
I.6. A krnyezet hasznlata
Mieltt a kvetkez rszben a nyelv rszletes jellemzinek ismertetstkezdennk, nzzk, hogy a felinstalllt Visual Studio.NET krnyezet segt-sgvel mikppen tudjuk az eddigi egy, illetve a ksbbi pldaprogramokatkiprblni.
Termszetesen nincs szksgnk egy tetszleges szvegszerkeszt(pl: emacs ) hasznlatra, hiszen a fejlesztkrnyezet ad egy jl hasznlhat
bels szvegszerkesztt, s nincs szksg a parancssori fordts parancs kiad-sra sem, hiszen ez a parancs egy menpontra van rdefinilva.
A fejlesztkrnyezet installcija utn a Start \ Programok menponton
keresztl indthatjuk el a Visual Studio.NET krnyezetet, ami a 3. brn lthatjellemzablakkal jelenik meg.
A jelenlegi fejlesztkrnyezetekben minden program valjban egy projekt-fednv alatt kszl el. Egy vagy tbb projekt felgyelete a Solution Explorerablakban vgezhet. A fmunkaterleten egy indul Start Pagelthat, amibena legutbbi projektek szerepelnek, illetve j vagy korbbi ltez projektetnyithatunk meg. Termszetesen a File menponton keresztl is elvgezhetkezek a feladatok.
-
5/20/2018 Programozas Csharp Nyelven Konyv
18/200
I. Alapismeretek
3. bra
A New Projectmenpont kivlasztsa utn, ahogy az az albbi ablakban isltszik, hrom fkrdsre kell vlaszolnunk:
4. bra
-
5/20/2018 Programozas Csharp Nyelven Konyv
19/200
I. Alapismeretek
1.
Ki kell vlasztani a programozsi nyelvet.2.
Az adott nyelvhez meg kell mondani, hogy milyen jelleg alkalmazstszeretnnk kszteni.
3.
Meg kell adni a munkaknyvtrat s a projekt nevt.
Ebben a knyvben a nyelvet illeten mindig a Visual C# Projectlehetsgetvlasztjuk, amit a nyitott mappajel is mutat.
A Templatesablakban vlaszthatjuk ki az alkalmazs jellegt. Jelen esetben,illetve a kvetkez rsz pldiban az n. Console Application lehetsgetvlasztjuk, ami egy hagyomnyos karakteres felletprogramkrnyezetet jelent.Ezek az alkalmazsok parancssori ablakban futnak.
A munkaknyvtr s a projekt nevnek megadsa azt jelenti, hogy ltre-
hozza a munkaknyvtron bell a projekt nvvel megadott knyvtrat, esetnk-ben a c:\programok\hajra knyvtrat, s ezen bell egy nknyes class1.csllo-mnyt, aminek tartalma a kvetkez:
5. bra
Ahogy lthat, a keretrendszer a class1.cs llomnyba mindent elkszt,hogy csak a valdi feladatra kelljen koncentrlnunk. Az llomny tartalmalnyegben megegyezik a korbbi elsprogramkddal. Ahogy mr emltettem,nem kteleznvteret (namespace)definilni, illetve nem ktelezaMainfgg-vny paramtert jellni, s a vgrehajtsi szl attribtum jellse is opcionlis.
-
5/20/2018 Programozas Csharp Nyelven Konyv
20/200
I. Alapismeretek
Ezeket, illetve a dokumentcis megjegyzseket figyelembe vve lthat, hogy akt kdrszlet azonos.
Amint a 3. brrl lthat, a fejlesztkrnyezet rendelkezik a mr szoksos-nak nevezhetberskori rtelmezssel (IntelliSense), s ha ltala ismert tpustfedez fel, akkor egy helyi ablakban megmutatja az aktulis objektum elrhet
jellemzit.A projekt a 3. brn lthat forrskd mellett mg egy assemblyinfo.csllo-
mnyt is tartalmaz, amiben hrom jellemzattribtum belltst vgezhetjk el.Bellthatjuk programunk jellemzadatait, verziszmt, illetve a digitlis al-rs kulcsllomnyra vonatkoz informcit is. Ezek a tulajdonsgok a .NETkeretrendszer szolgltatsain alapulnak, aminek rszletezse meghaladja ennek aknyvnek a kereteit.
A programot a Debug menpont Start (F5) vagy Start without debugging(CTRL-F5) menpontjval fordthatjuk le, illetve futtathatjuk. Ez utbbi men-pontot hasznlva a parancssori ablak nem tnik el a program futsa utn,lehetsget biztostva a program eredmnynek megnzsre.
6. bra
A fordts hatsra ltrejn a c:\programok\hajra knyvtrban egy bin segy objknyvtr. Ez utbbiban a lefordtott llomnyok, mg a binknyvtrbanegy Debug vagy Release knyvtrban ltrejn a kvnt exe program is. A ktvltozat kzti klnbsg a nevbl addik, nevezetesen a Debugvltozatban anyomkvets elsegtst biztostva kszl el a futtathat llomny. Ez a lehet-sg a programfejlesztsek sorn nagyon hasznos, hiszen logikai vagy egybhibk keressben a lpsenknti, nyomkvet mdszerrel trtn vgrehajtsnlklzhetetlen. A Release, kiadsi vgleges vltozatot a program befejezse-knt az 5. bra fejlcben lthatDebug-Releasevlasztmezlltsval kszt-hetjk el.
Tbbfelhasznls krnyezetben, pldul Windows XP opercis rendszeralatt, aDebugger Userscsoportba minden fejlesztt bele kell rakni.
A knyv msodik rszben a C# nyelv elemeinek megismersekor jellemz
projekttpusknt konzolalkalmazst (6. bra) hasznlunk.
-
5/20/2018 Programozas Csharp Nyelven Konyv
21/200
I. Alapismeretek
I.7. Windows alkalmazsok ksztse
Az alkalmazsok msik, s taln ma mr szlesebb krben hasznlt csoportjaa grafikus alkalmazs ksztse. Ezeket a programokat Windows alkalmazsnakis szoktk nevezni.
Ahogy a karakteres alkalmazsoknl mr lttuk, j feladatot (projektet) k-sztve a Windows Application (Windows alkalmazs) lehetsget vlasztjuk smegadjuk a nevet, ahogy az a kvetkezkpen lthat.
7. bra
Miutn a fenti dialgusablakban befejezzk az adatok megadst, azt lthat-juk, hogy a karakteres alkalmazsokhoz kpest a munkafellet megvltozik,hiszen ebben a rendszerben az az alapelkpzels, hogy egy res ablak (form)azindul program.
Ez valjban azt jelenti, hogy egy grafikus tervezablakot kapunk (Form1),amibe az eszkztrbl (Toolbox) a szksges vezrlelemeket a grafikus fel-letre visszk, s ekzben a forrskdot (form1.cs) a keretrendszer a fellet-alaktsnak megfelelen automatikusan mdostja.
-
5/20/2018 Programozas Csharp Nyelven Konyv
22/200
I. Alapismeretek
Az elsgrafikus programunkhoz hrom lpst vgezznk el!
1.
rjuk t az ablak fejlcszvegt. Ehhez kattintsunk egyet aform-ra, majda jobb als Properties (Tulajdonsgok) ablakban rjuk t a Text tulaj-donsgot. (Elsprogram!)
2.
A Toolbox ablakbl helyezznk fel egy Button, nyomgomb objektu-mot. A Tulajdonsgablakban lltsuk t a Textmezt a Vgeszvegre.
3. Kattintsunk kettt a nyomgomb objektumra, ezzel a nyomgomb alap-rtelmezett kattints esemny fggvnyt definiltuk. Ebbe rjuk be aClose(), ablakbezrs utastst. Ekkor a form1.cs forrskd rszlete akvetkezkppen 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 akorbbi karakteres program esetben is a Debug men Start menpontjvaltehetjk meg.
Ahhoz, hogy tovbbi grafikus alkalmazsokat tudjunk kszteni, elenged-hetetlenl szksges, hogy ismerjk egyrszt a vlasztott nyelv lehetsgeit,msrszt a rendszer knyvtri szolgltatsait.
Az elbbi, a nyelvi lehetsgek megismerse ltalban a legknnyebb sleggyorsabb feladat. Ez remnyeim szerint a kvetkez rsz ttanulmnyozsautn a kedves Olvasnak is sikerl. Viszont az utbbi, a rendszer knyvtri
szolgltatsainak megismerse hosszabb, tbb idt, sok egyni munkt jelentfeladat. Azt remlem, hogy a befejez, a grafikus alkalmazsok alapjaival fog-lalkoz rsz utn mindenki elg btorsgot rez magban a tovbbi nllmunka folytatshoz.
-
5/20/2018 Programozas Csharp Nyelven Konyv
23/200
I. Alapismeretek
I.8. Feladatok
1.
Milyen kd programot fordt a Visual Studio.NET fejleszt
krnyezet?2. Mit csinl a Garbage Collection (szemtgyjt) algoritmus?
3.
Lehet-e kezetes karaktereket hasznlni a C# programban?
4.
Mik aMainfggvny jellemzi?
5.
Egy program hny Main fggvnyt tartalmazhat, hogy tudjuklefordtani?
-
5/20/2018 Programozas Csharp Nyelven Konyv
24/200
28
II. A C# nyelv alaptpusai
Egy programozsi nyelvben az egyik legfontosabb tulajdonsg az, hogyprogramkszts sorn hogyan s milyen tpus adatokat hasznlhatunk. Megkell jegyezni, hogy van nhny olyan programozsi nyelv is (pl. PhP), ahol ez aterlet nem igazn fontos, tpusok gyakorlatilag nincsenek, adatot szksgszerinti tpusban a programoz rendelkezsre bocst.
A C# szigoran tpusos nyelv, ebben a nyelvben csak ennek figyelembe-vtelvel hasznlhatunk sajt vltozkat.
II.1. Vltozk definilsa
A nyelvben a vltozk definilsnak alakja:
tpus vltoznv ;
Azonos tpus vltozkat egymstl vesszvel elvlasztva definilhatunk. Atpusok ismerete nlkl nzznk nhny pldt vltozk definilsra.
Plda:
char ch; // ch vltoz karakter tpusint egy, tizenegy; // az egy s tizenegy egsz tpus
Vltozk lehetnek klsk, azaz fggvnyen kvliek, vagy belsk, azazfggvnyen belliek. A fggvnyen kvli vltozk is termszetesen csak oszt-lyon belliek lehetnek. Gyakran hvjk ezeket a vltozkat adatmezknek is.
Belsvltozk, az adott blokkon (fggvnyen) belli loklis vltozk lehet-nek dinamikus vagy statikus lettartamak. Mdost jelz nlkli definilsesetn dinamikusnak vagy automatikusnak nevezzk, s ezek lettartama a blokk-
ban val tartzkods idejre korltozdik. Ha a blokk vgrehajtsa befejezdtt,a dinamikus vltozk megsznnek.
Statikus lettartam bels vltozt a static sz hasznlatval (ahogy klsvltoz esetn igen) nem definilhatunk. Lttuk, a fggvnyek lehetnek stati-kusak (lsdMainfggvny), melyekre ugyanaz igaz, mint az osztlyvltozkra,ezen fggvnyek lettartama is a programval egyezik meg, ms szval ezenfggvnyek a program indulsakor jnnek ltre.
-
5/20/2018 Programozas Csharp Nyelven Konyv
25/200
II. A C# nyelv alaptpusai
A vltozkat kt kategriba sorolhatjuk, az osztlytpus vltozk referen-cia tpusak, melyek mindig a dinamikus memriban helyezkednek el (azirodalomban ezt gyakran heap-nek nevezik), mg minden ms nem osztly-tpus, az gynevezett rtktpus (value type) vltoz. Az rtktpus vl-tozkat szoktkstack vltozknakis nevezni.
Az rtktpus vltozk kezdrtkt, az inicializls hinyban, 0, false,nullrtkre lltja be a fordt.
A vltozk definilsakor rgtn elvgezhetazok direkt inicializlsa is.
II.2. llandk definilsallandk definilst a tpusnv el rt consttpusmdost szcska segts-
gvel tehetjk meg. A definci alakja:
const tpus nv = rtk;
Plda:
const float g=9.81; // vals konstans
g=2.3; // !!! HIBAconst int min=0; // egsz konstans
II.3. Vltozk inicializlsa
Vltozk kezdrtkadsa, inicializlsa azok definilsakor is elvgezhet
a kvetkez
formban:
tpus vltoz = rtk;
Plda:
char s='a'; int []a={1,2,3};char[] b="Egy";
A vltozk, konstansok s fggvnyek hasznlatra nzzk a kvetkezpldt.
-
5/20/2018 Programozas Csharp Nyelven Konyv
26/200
II. A C# nyelv alaptpusai
Plda:
// A valtozo.cs fjl tartalma:
using System;// A kirshoz szksges deklarcit tartalmazza.class vltoz{
static int alma=5; //alma vltoz defincija//s inicializlsa
static float r=5.6F //statikus vals tpus vltoz//vals konstanst zrhat az//F (float) bet
const float pi=3.1415; //konstans definci
static void Main(){Console.WriteLine( "Teszt"); //eredmny TestConsole.WriteLine( alma ); //eredmny 5int alma=6; //helyi vltozConsole.WriteLine( alma ) ; //eredmny 6Console.WriteLine( vltoz.alma ); //a klstakart (5)
//vltozra hivatkozsConsole.WriteLine( terlet(r)); //a terlet fggvny
// meghvsa}
static float terlet(float sugr) // fggvnydefinci{
return(pi*sugr*sugr);}
}
Br mg nem definiltunk fggvnyeket, gy taln korainak tnhet ez aplda, de inkbb felhvnm mg egyszer a figyelmet az kezetes karakterekhasznlatra. A ksbbi mintafeladatokban, ha elfordul kezet nlkli vltoz,fggvnydefinci, akkor az csak a korbbi krnyezetek rossz uthatsnak
ksznhet. Egy osztlyon bell a fggvnyek definilsi sorrendje nemlnyeges. Sok krnyezetben furcsa lehet amit a fenti pldban ltunk, hogyelbb hasznljuk, s csak ezutn definiljuk a fggvnynket. (terlet fggvny)
II.4. Elemi tpusok
char karakter tpus (2 byte hossz)
-
5/20/2018 Programozas Csharp Nyelven Konyv
27/200
II. A C# nyelv alaptpusai
A karakter tpus 16 bites karakterbrzolst (unikd) hasznl. ltalbanigaz, hogy minden alaptpus mrete rgztett.
A karakter tpus vltoz rtkt aposztrf (') jelek kztt tudjuk megadni.Plda:
char c;c='a';
A backslash (\) karakter specilis jelentssel br. Az utna kvetkezkarak-ter(eke)t, mint egy escape szekvencit dolgozza fl a fordt. Az gy hasznlhatescape szekvencik a kvetkezk:
\a - a 7-es kd csipogs\b - backspace, elzkarakter trlse\f - formfeed, soremels karakter\r - kocsi vissza karakter\n - j sor karakter (soremels+kocsi vissza)
Az j sor karakter hatsa azonos a formfeed s a kocsi vissza karakterekhatsval.
\t - tabultor karakter\v - fggleges tabultor
\\ - backslash karakter\' - aposztrf\" - idzjel\? - krdjel\uxxyy xx s yy unikd karakter
string karaktersorozat
A System.Stringosztlynak megfelel tpus. Szvegek kztt a + s a +=
szvegsszefzst vgz opertorok ismertek. A [] opertor a szveg adottindex karaktert adja meg. Az indexels 0-val kezddik. A @ karakter kik-szbli a szvegen belli rzkeny karakterek hatst. Ilyen pldul a
backslash (\) karakter.
Plda:
char c='\u001b'; // c= a 27-es kd (Esc) karakterrelstring s="alma";string n="alma"+"barack";s+="fa"; //s= almafa
-
5/20/2018 Programozas Csharp Nyelven Konyv
28/200
II. A C# nyelv alaptpusai
char c1=s[2]; // c1= mchar c2="szia"[1]; // c2=zstring f="c:\\programok\\alma.txt";
string file=@"c:\programok\alma.txt";A String osztly a fenti lehetsgeken kvl egy sor fggvnnyel teszi
hasznlhatbb ezt a tpust. Ezen fggvnyek kzl a legfontosabbak:
LengthCsak olvashat tulajdonsg, megadja a szveg karaktereinek a szmt:
string s="alma";int i=s.Length; //i=4
CompareTo(string)Kt szveg sszehasonltst vgzi. Ha az eredmny 0, akkor azonos a ktszveg:
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){} // azonoselse{} // nem azonos
IndexOf(string)
Tbb alakja van, megadja, hogy az eredetiben melyik indexnl tallhat aparamterl kapott szveg. A visszaadott rtk 1 lesz, ha nincs benn akeresett szveg:
int i="almafa".IndexOf("fa"); //4
Insert(int,string)A msodik paramterl kapott szveget, az els paramterrel megadottindextl beszrja az eredeti szvegbe:
-
5/20/2018 Programozas Csharp Nyelven Konyv
29/200
II. A C# nyelv alaptpusai
string s="almafa alatt";string ujs=s.Insert(4," a "); // alma a fa alatt
A szvegtpus tovbbi szolgltatsait, fggvnyeit a szvegosztly(System.String) online dokumentcijban rdemes megnzni. Meg kell emltenimg azt, hogy a szvegosztly fggvnyei nem mdostjk az eredeti szveget,szvegobjektumot, pldaknt az elzs szveges vltoz rtke vltozatlanmarad.
Szveges feldolgozsi feladatok sorn a regulris kifejezsekkel megadhatszvegmintk segtsgt is ignybe vehetjk. A .NET Framework a Perl5 kompa-tibilis regulris kifejezshasznlatot tmogatja. A Regex osztly szolgltatja aregulris kifejezst, mg a Match a tallati eredmnyt. Az osztlyokat aSystem.Text.RegularExpressionsnvtrben talljuk.
Plda:
using System;using System.Text.RegularExpressions;class regulris{
public static void Main(){
Regex reg_kif = new Regex("fradi");// a fradi keresse
Match tallat = reg_kif.Match("A Fradi j csapat?");if (tallat.Success){
// (hol talltuk megConsole.WriteLine("A tallat helye: " + tallat.Index);
}}
}
A fenti plda nem ad eredmnyt, hiszen alaprtelmezsben a kis- s nagy-betklnbzik, mg ha a regulris kifejezst egy kicsit mdostjuk, az albbiak
szerint:Regex reg_kif = new Regex("adi");
akkor a futsi eredmny az albbi lesz:
-
5/20/2018 Programozas Csharp Nyelven Konyv
30/200
II. A C# nyelv alaptpusai
8. bra
Ha azt szeretnnk elrni, hogy az eredeti szvegnk is vltozzon, akkorehhez a System.Textnvtr StringBuilderosztlyt tudjuk ignybe venni.
Plda:
using System.Text;StringBuilder s1 = new StringBuilder("almafa alatt");s1.Insert(4," a ");Console.WriteLine(s1); // "alma a fa alatt"
int egsz tpus(4 byte)Az egsz tpus rtkek ngy bjtot foglalnak a ma leggyakrabban hasznlt
nyelvi krnyezetben , gy rtelmezsi tartomnyuk -231, 231- 1 kztt van.
long hossz egsz (8 byte)short rvid egsz (2 byte)sbyte eljeles (signed) bytefloat vals (4 byte)double dupla pontossg vals (8 byte)decimal pnzgybeli tpus (16 byte), 28 helyirtk
Mindkt egsz tpus eljeles, ha erre nincs szksgnk, hasznlhatjuk az el-jel nlkli vltozatukat, melyek: uint, ushort, byte, ulong.
Vals szmok definilsakor a 10-es kitevt jellekonstans hasznlhat.
Plda:
float a=1.6e-3; // 1.6 * 10-3
void tpus nlkli tpusAz olyan fggvnynek (eljrsnak) a tpusa, amelyik nem ad vissza rtket.
-
5/20/2018 Programozas Csharp Nyelven Konyv
31/200
II. A C# nyelv alaptpusai
Plda:
void nvel(ref int mit)
{ mit++;}
Az imnti fggvny paramternek jellse referencia szerinti paramter-tadst jelent, amirl aFggvnyekc. fejezetben rszletesen szlunk.
bool logikai tpus (1 byte)A logikai tpus rtke a true (igaz) vagy false (hamis) rtket veheti fel.
Ahogy a nyelv foglalt alapszavainl lthattuk, ezeket az rtkeket a truesfalse
nyelvi kulcssz adja meg.ltalban elmondhat, hogy mg a nyelv nem definil sok alaptpust, addigaz egyes implementcik, fleg azok grafikus fellet alatti knyvtrai ezt bs-gesen ptoljk, s gyakran tbb idt kell az 'j tpusok' megfejtsnek szentelni,mint a fggvnyek tanulmnyozsnak.
II.5. Felsorols tpus
A felsorols tpus gyakorlatilag nem ms, mint egsz konstans(ok), szinoni-
mk definilsa. Felsorols tpust nvtren vagy osztlyon bell definilhatunk.Ennek a kulcsszava az enum. A kulcssz utn a felsorols tpus azonostjt
meg kell adni. A System.Enum osztly szinonimjt adja az ezen kulcsszsegtsgvel definilt tpus.
Plda:
enum szinek {piros,kk,zld,srga};enum betuk {a='a', b='b'};betuk sajtbet=betuk.a; // vltoz kezdrtke aenum valami { x="alma"}; // hiba
Ekkor a 0,1, rtkek rendeldnek hozz a felsorolt nevekhez, s a nevekkirsakor ezen szmokat is ltjuk. A kezdrtkads lehetsgvel lve nemkell ezeket felttlenl elfogadnunk, hanem mi is megadhatjuk az rtkket.
Plda:
class Szinek{
enum jszinek {piros=4, kk=7, zld=8, srga=12};
public static void Main()
-
5/20/2018 Programozas Csharp Nyelven Konyv
32/200
II. A C# nyelv alaptpusai
{Console.WriteLine(jszinek.zld); // kirja a sznt//ciklus a szneken trtnvgighaladsra
for(jszinek i=jszinek.kk; i
-
5/20/2018 Programozas Csharp Nyelven Konyv
33/200
II. A C# nyelv alaptpusai
s/vagy mveletekkel a felsorolsadatok kombincijt hatrozhatjuk meg.Ebben az esetben a [Flags]attribtumot kell az enumszcska el szrni.
Plda:
[Flags] enum alma{piros=1,jonatn=2,zld=4,golden=8};alma a=alma.piros | alma.jonatn;Console.WriteLine(a); // piros, jonatna=(alma) System.Enum.Parse(typeof(alma),"zld,golden");// a felsorols tpus egyszerrtkadsa helyett// a knyvtri hvs lehetsgt is hasznlhatjuk
//Console.WriteLine(a.GetHashCode());// eredmny 12 lesz
Bithez kttt rtkek esetn ktelezminden egyes konstans nvhez meg-adni a neki megfelelbites brzolst!
Az alaptpusokat a .NET keretrendszer biztostja, gy ennek a fejlesztsikrnyezetnek egy msik nyelvben pontosan ezek a tpusok llnak rendelke-zsre. Az termszetesen elfordulhat, hogy nem ezekkel a nevekkel kell rjuk
hivatkozni, de a nyelvi fordt biztosan ezen rtelmezs szerinti kdot (kzteskd) fordtja le a keretrendszer, mint futtat krnyezet szmra.Az alaptpusok zrsaknt meg kell jegyezni, hogy a mutat tpus is rtelme-
zett, ahogy a C++ vilgban, de ennek a hasznlata csak olyan C# programrsz-ben megengedett, amely nem biztonsgos krnyezetben helyezkedik el (unsafecontext). 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 lettartamvltoz kztt?
4. Definiljon kt szveg tpus vltozt, adja meg a hosszukat!
5.
brzolja felsorols tpussal az NB 1 bajnoksg csapatait!
-
5/20/2018 Programozas Csharp Nyelven Konyv
34/200
38
III. Kifejezsek, mveletek
A nyelv jellemzje a korbban (pldul C++ nyelvben) megismert,megszokott kifejezsfogalom, amit tmren gy is fogalmazhatunk, hogy avezrlsi szerkezeteken kvl a nyelvben minden kifejezs.
Egy kifejezs vagy elsdleges kifejezs, vagy opertorokkal kapcsoltkifejezs.
Elsdleges kifejezsek:
azonost (kifejezs) elsdleges kifejezs[]
fggvnyhvs elsdleges kifejezs.azonost
A kifejezseket egy-, kt- vagy hromoperandus opertorokkal kapcsol-hatjuk ssze.
Egy kifejezsen bell elszr az elsdleges kifejezsek, majd utna azopertorokkal kapcsolt kifejezsek kerlnek kirtkelsre.
A nyelvben hasznlhat opertorok prioritsi sorrendben a kvetkezk.
III.1. Egyoperandus opertorok
newA dinamikus helyfoglals opertora. A helyfoglals opertornak egyetlenoperandusa az, hogy milyen tpus objektumnak foglalunk helyet. Sikereshelyfoglals esetn a mvelet eredmnye a lefoglalt memria cme.Sikertelen helyfoglals esetn a nullmutat a visszatrsi eredmny.
Plda:
int[]a;a = new int; //egy egsz trolshoz
//elegendhely foglalsaa = new int[5] //t egsz szmra foglal helyet
A new utasts gyakran szerepel a vektorokkal sszefggsben, amirlksbb rszletesen szlunk.
-
5/20/2018 Programozas Csharp Nyelven Konyv
35/200
III. Kifejezsek, mveletek
A .NET keretrendszer egyik legfontosabb tulajdonsga az, hogy adinamikusan foglalt memriaterleteket automatikusan visszacsatolja a fel-hasznlhat memriatartomnyba, ha arra a memrira a programnak mr nincsszksge. Sok nyelvi krnyezetben erre a deleteopertor szolgl.
- aritmetikai negls! logikai negls (not)~ bitenknti negls,++,-- inc, dec.(tpus) kifejezs tpusknyszerts
Plda:
double d=2.3;int i=(int) d; // i=2
A ++ s -- opertor szerepelhet mind pre-, mind postfix formban. Prefixesetben a vltoz az opertorral vltoztatott rtkt adja egy kifejezskirtkelsekor, mg postfix esetben az eredetit.
Plda:
a= ++b; // hatsa: b=b+1; a=b;a= b++; // hatsa: a=b; b=b+1;
Az egyoperandus opertorok s az rtkads opertora esetn a vgrehajtsjobbrl balra haladva trtnik, minden ms opertor esetn azonosprecedencinl balrl jobbra.
III.2. Ktoperandus opertorok
* szorzs/ oszts% maradkkpzs
E hrom opertorral mindig igaz: az (a/b)*b+a%b kifejezs az a rtktadja.
(% opertor esetn az operandusok nem lehetnek valsak, s a prioritsukazonos.)
-
5/20/2018 Programozas Csharp Nyelven Konyv
36/200
III. Kifejezsek, mveletek
+ sszeads, string esetn azok sszefzse kivons> bitenknti jobbra lptets
A jobbra lptets opertorhoz pldnak tekintsk az a >> b; utastst.Ekkor ha az aunsigned, akkor balrl nullval, klnben pedig az eljelbittel tlta bitenknti jobbra lptets opertora.
Plda:
int a= 1, b;b= a >> 2; // b rtke -1 marad
kisebb, nagyobb relcis opertorok= kisebb vagy egyenl, ill. a nagyobb vagy egyenl
opertorok==, != egyenl, nem egyenlrelcis opertorok& bitenknti s^ bitenknti kizr vagy| bitenknti vagy&& logikai s|| logikai vagy
isLogikai opertor, egy objektumrl megmondja, hogy a bal oldali operandusa 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!");
asKtoperandus tpusknyszerts. A bal oldali vltozt a jobb oldali referencia tpusraalaktja, ha tudja. Ha sikertelen az talakts, akkor eredmnyl a nullrtket 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.
-
5/20/2018 Programozas Csharp Nyelven Konyv
37/200
III. Kifejezsek, mveletek
typeofEgy System.Type tpus objektumot kszt. Ennek az objektumnak amezfggvnyeivel, tulajdonsgaival (FullName, GetType()) tudunk tpus-informcihoz jutni.
Plda:
using System;class Teszt{
static void Main(){Type[] t = {
typeof(int),typeof(string),
typeof(double),typeof(void)};
for (int i = 0; i < t.Length; i++){
Console.WriteLine(t[i].FullName);}
}}
A program futsa a kvetkezeredmnyt produklja:
System.Int32System.StringSystem.DoubleSystem.Void
A tpuskonverzival kapcsolatban elmondhat, hogy minden rtktpusblltrehozhatunk egy neki megfelel Object tpus objektumot. Ezt gyakranboxing-nak, csomagolsnak, mg az ellenkezkicsomagol mveletet, amihez a
zrjeles tpuskonverzi opertort kell hasznlni, unboxing-nak nevezi aszakirodalom.
Plda:
int i=5;Object o=i; // boxing, becsomagolsint j=(int) o; // unboxing, kicsomagols
Az Object tpus, ami a System.Object tpusnak felel meg, minden tpusseknt tekinthet. Ennek a tpusnak a fggvnyei ily mdon minden ltalunk
hasznlt tpushoz rendelkezsre llnak.
-
5/20/2018 Programozas Csharp Nyelven Konyv
38/200
III. Kifejezsek, mveletek
Az Objecttpus tagfggvnyei a kvetkezk:
ToString()Megadja az objektum szveges reprezentcijt. Ha erre van szksg,pldul kirsnl, akkor ezt automatikusan meghvja. Ha ezt egy j tpushozjradefiniljuk, akkor ez hvdik meg kirs esetn.
Console.WriteLine(o); // indirekt ToString hvsConsole.WriteLine(o.ToString());
GetType()Megadja az objektum tpust, hasonl eredmnyt ad, mint a korbban ltott
typeofopertor.Equals(object)Megadja, hogy kt objektum egyenl-e, logikai rtket ad eredmnyl.
int i=5;object o=i;Console.WriteLine(o.Equals(5));
Az Equalsfggvnynek ltezik egy statikus vltozata is, aminek a formja:Object.Equals(object, object)
GetHashCode()Megadja az objektum hash kdjt, ami egy egsz szm. Tetszleges sajtutdtpusban jradefinilhatjuk, amivel a sajt tpusunk hashkdjt tudjukszmolni.
III.3. Hromoperandus opertor
Az opertorral kpezhetkifejezs alakja a kvetkez: e1 ? e2 : e3, ahol a ?s a :az opertor jelei, mg e1,e2,e3kifejezsek.
A kifejezs rtke e2ha e1igaz (nem 0), klnben e3.
Plda:
char c;int a;
a=((c>='0' && c
-
5/20/2018 Programozas Csharp Nyelven Konyv
39/200
III. Kifejezsek, mveletek
Az avltoz vagy a 0-9 vagy 1 rtket kapja.A hromoperandus opertor valjban egy logikai elgazs utasts. A
hatkony kifejezskszts, tmrebb rsmd kivl eszkze.
III.4. Ktoperandus rtkad opertorok
= rtkads opertora
A nyelvben az rtkads sajtos, nmaga is kifejezs. Az egyenlsgjel bal
oldaln olyan kifejezs, vltoz llhat, amely ltal kpviselt adat j rtketvehet fel. Gyakran hvja a szakirodalom ezt balrtknek is (lvalue). Azegyenlsgjel jobb oldaln egy rtket ad kifejezs kell, hogy lljon (jobb-rtk, rvalue). Ez gyakorlatilag azt jelenti, hogy a jobbrtkre semmilyenkorltozs nincs.
Az rtkads sorn a bal oldal megkapja a jobb oldali kifejezs rtkt, segyben ez lesz a kifejezs rtke is.
Plda:
char []d=new char[80]; // msoljuk az s forrsszveget d-bewhile (i>=,
-
5/20/2018 Programozas Csharp Nyelven Konyv
40/200
III. Kifejezsek, mveletek
Plda:
int a=2;
a *= 3; // a= a*3, azaz a rtke 6 leszstring b="alma";b+="fa"; // b=almafa
A tpusok egyms kzti konverzijval kapcsolatban azt lehet mondani,hogy a C vagy C++-ban ismert automatikus konverzik nem lteznek. Egyegsz tpus vltozt egy valsba gond nlkl berhatunk, mg fordtva mrhibt jelez a fordt. A konverzis lehetsgek szles skljt nyjtja afejleszteszkznk.
Konverzikkal kapcsolatban kt esetet szoktak megklnbztetni. Ezek
kzl az els
szm szvegg alaktsa. Ez gyakorlatilag nem ignyel semmilyensegtsget, a szmtpushoz tartoz osztly ToString fggvnyt hvja meg afordt. Ehhez nem kell semmit sem tenni.
Plda:
int a=2;string s="Az eredmny:" + a;
A msik eset, mikor szvegbl szeretnnk szmot kapni, mr nem ilyenautomatikus, de semmikppen nem lehet bonyolultnak nevezni. Tbbfle
mdszer lehet az alaktsra, de a legltalnosabb taln a Convert osztlyhasznlata. Az osztly konvertl fggvnyei azonos nvkonvencival az albbiformjak:
Convert.ToCTStpusnv
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
rdekessgknt megemltem, hogy ltezik a Convert.ToDateTime(object)fggvny is, ami egy knyvtri dtumtpust kszt a paramterl kapott objek-tumbl.
Ha brmelyik konvertl fggvny hibs paramtert kap, nem tud eredmnytproduklni, akkor InvalidCastException kivtelt vagy ms, a hiba okra utal
kivtelt generl. A kivtelkezelsr
l ks
bb rszletesen is fogunk beszlni.
-
5/20/2018 Programozas Csharp Nyelven Konyv
41/200
III. Kifejezsek, mveletek
ltalban igaz, hogy grafikus alkalmazsok sorn a bert adataink szve-gesek, gy minden esetben az azokkal trtnszmols eltt konvertlnunk kell,ezrt a konvertl fggvnyek hasznlata elg gyakori.
Hasonl konvertl szolgltatsokat kapunk, ha az alaptpusok Parse fgg-vnyt hasznljuk (int.Parse(szveg), double.Parse(szveg)).
Gyakran elfordul, hogy az alapmveletek nem elgtik ki a szmolsiignyeinket. A SystemnvtrMathosztlya a leggyakrabban hasznlt szmolsimveleteket biztostja. A leggyakrabban hasznlt fggvnyek a kvetkezk:
Math.Sin(x) sin(x), ahol az x szg rtktradinban kell megadni
Math.Cos(x) cos(x)Math.Tan(x) tg(x)Math.Exp(x) exMath.Log(x) ln(x)Math.Sqrt(x) x ngyzetgykeMath.Abs(x) x abszolt rtkeMath.Round(x) kerekts a matematikai szablyok szerintMath.Ceiling(x) felfel kerektsMath.Floor(x) lefel kerektsMath.Pow(x,y) hatvnyozs, xy
Math.PI a PI konstans (3.14159265358979323846)Math.E az e konstans (2.7182818284590452354)
Plda:
double dd=Math.Sin(Math.PI/2);Console.WriteLine(dd); // rtke 1.dd=Math.Pow(2,3);Console.WriteLine(dd); // 8
Matematikai, statisztikai feladatoknl a vletlenszmok hasznlata gyakoriigny. A System nvtr Random osztlya nyjtja a pszeudo-vletlenszmokgenerlsnak lehetsgt. Egy vletlenszm-objektum ltrehozst a rendszer-idhz (paramter nlkli konstruktor) vagy egy adott egsz szmhoz kthetjk.A vletlenobjektum Next fggvnye a kvetkez vletlen egsz szmot, a
NextDoublea kvetkezvals vletlenszmot adja. ANextfggvnynek hrom,mg a NextDouble fggvnynek egy vltozata van, amit a kvetkez plda is
bemutat.
-
5/20/2018 Programozas Csharp Nyelven Konyv
42/200
III. Kifejezsek, mveletek
Plda:
Random r=new Random();
//r vletlenszm objektum rendszeridalap ltrehozsaRandom r1=new Random(10);// r1 vletlenobjektum genertor a 10 rtkbl indul ki//int v= r.Next();// vletlen egsz szm 0 s MaxInt (legnagyobb egsz) kztt//0 lehet az rtk, MaxInt nem//int v1=r.Next(10);// vletlen egsz szm 0 s 10 kztt, 0
-
5/20/2018 Programozas Csharp Nyelven Konyv
43/200
47
IV. sszetett adattpusok
IV.1. Tmbk
A feladataink sorn gyakori igny az, hogy valamilyen tpus elembl tbbetszeretnnk hasznlni. Amg ez a tbb kettvagy hrom, addig megolds lehet,hogy kt vagy hrom vltozt hasznlunk. Amikor viszont tz, hsz adatra vanszksgnk, akkor ez a fajta megolds nem igazn knyelmes, s sok esetben
nem is kivitelezhet. Lehetsg van azonos tpus adatok egy kzs nvvel valsszekapcsolsra, s az egyes elemekre index segtsgvel hivatkozhatunk. Eztaz adatszerkezetet tmbnek nevezzk. A tmbk elemeinek elhelyezkedse amemriban sorfolytonos. A tmb helyett gyakran hasznljuk a vektor szt,annak szinonmjaknt.
A C# nyelv minden tmb- vagy vektortpus defincit a System.Arrayosz-tlybl szrmaztat, gy annak tulajdonsgai a meghatrozak.
A tmbk defincijnak formja a kvetkez:
tpus[] nv;
Az egyes tmbelemekre val hivatkozs, a tmbk indexelse mindig 0-valkezddik. Az index egsz tpus kifejezs lehet, a tpus pedig tetszleges.
Egy tmb ltalnos defincija nem tartalmazza az elemszm rtkt. Br anyelv krnyezetben nem lehet mutatkat definilni, de ez gyakorlatilag azt
jelenti. A vektor defincija egy referencia tpus ltrehozsa, s a nyelv mindenreferencia tpust a new opertorral kell konkrt rtkekkel inicializlni(pldnyostani). Ekkor kell megmondani, hogy az adott vektor hny elemlesz.Minden vektornak, ellenttben a C++ nyelvvel, a ltrehozsa utn lekrdezhet
az elemszma a Length tulajdonsggal.Plda:
int[] numbers; // egsz vektordefincinumbers = new int[10]; // 10 elemlesz az egsz vektorunknumbers = new int[20]; // most meg 20 elemlettint db = 15;numbers = new int[db]; // egy vltoz adja a hosszt
-
5/20/2018 Programozas Csharp Nyelven Konyv
44/200
IV. sszetett adattpusok
Mivel a nyelv minden dinamikus referencia tpusnak memriabeli fel-szabadtst a rendszer automatikusan vgzi ezt az irodalom gyakran szemt-gyjtsi algoritmusnak (garbage collection) nevezi , ezrt a pldabeli 10 elemvektor memriahelyt automatikusan visszakapja az opercis rendszer.
A vektorelemek a fenti dinamikus ltrehozs utn 0 kezdrtket kapnak. Haegyb elemekkel szeretnnk az inicializcit elvgezni, kapcsos zrjelek kzrva adhatjuk meg azokat.
tpus[] nv={rtk, rtk,};
Plda:
int[] n={3,4,5,6};int hossz= n.Length; // vektorhossz meghatrozs
Ha logikai vektort definilunk, akkor a vektorelemek kezdrtkads hi-nyban logikai hamis (false), mg ha referencia vektort definilunk, akkor areferenciaelemek a nullkezdrtket 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. Ezen-kvl mg definilhat kt- vagy tbbindex, multidimenzis vektor, illetve vek-torok vektora.
Multidimenzis vektor:
Plda:string[,] nevek;nevek= new string[2,4];
A vektor dimenzijt aRanktulajdonsggal krdezhetjk le.
Console.WriteLine(nevek.Rank); // 2// az egyes dimenzikbeli mretet a GetLength adjaConsole.WriteLine(nevek.GetLength(0)); // 2
-
5/20/2018 Programozas Csharp Nyelven Konyv
45/200
IV. sszetett adattpusok
Console.WriteLine(nevek.GetLength(1)); // 4
Termszetesen a norml vektornak (int[] v) is lekrdezhetjk a dimenzirtkt.
Plda:
int[,] numbers = new int[3, 2] { {1, 2}, {3, 4}, {5, 6} };string[,] kapocs = new string[2, 2] { {"Miki","Ani"}, {"Mari","Albert"} };int[,] numbers = new int[,] { {1, 2}, {3, 4}, {5, 6} };string[,] kapocs = new string[,] { {"Miki","Ani"}, {"Mari","Albert"} };int[,] szmok = { {1, 2}, {3, 4}, {5, 6} };string[,] kapocs = { {"Miki", "Ani"}, {"Mari", "Albert"} };
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 vektordefinci, ahol elszr megmondjuk, hogy hny elem a mutat vektor, majdezutn 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 elemvektor lesz a szamok elsvektoranew int[] {5,6}// ez a kt elemvektor 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} };
-
5/20/2018 Programozas Csharp Nyelven Konyv
46/200
IV. sszetett adattpusok
Hasznlat:
numbers[1][1] = 5;
Termszetesen mindkt esetben multidimenzis, vektorok vektora nemcsak ktdimenzis esetrl beszlhetnk, hanem tetszleges mretvektorrl.
Plda:
int[,,] harom = new int[4,5,3];
Lehetsgnk van a ktfle vektordefinci kevert hasznlatra is. A kvetkezpldaegy olyan egyszervektort definil, aminek minden eleme 32 dimenzis szablyos mtrix.
Plda:
int[][,,][,] mix;
Ezek utn rjunk egy pldaprogramot, amely bemutatja a korbban megbe-szlt vektorjellemzk hasznlatt:
Plda:
//vektor.csusing System;
class vektorpelda{
public static void Main(){
// Sima vektordefinci, a definci pillanatban// 5 elemvektor 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 emltibyte[][] scores = new byte[5][];
// Az egyes vektorok definilsafor (int i = 0; i < scores.Length; i++){
scores[i] = new byte[i+3]; // elemrl elemre naz elemszm.}// Egyes sorok hossznak kirsa
-
5/20/2018 Programozas Csharp Nyelven Konyv
47/200
IV. sszetett adattpusok
for (int i = 0; i < scores.Length; i++){Console.WriteLine("Az {0} sor hossza: {1}", i, scores[i].Length);
// A {} jelek kztti szmmal hivatkozhatunk az elsparamter// utni tovbbi rtkekre. {0} jelenti az i vltozt.// Hasznlata nagyon hasonlt a C printf hasznlathoz.
}}
}A program futsa utn a kvetkezeredmnyt kapjuk:
Az 0 sor hossza: 3Az 1 sor hossza: 4Az 2 sor hossza: 5Az 3 sor hossza: 6Az 4 sor hossza: 7
Plda:
string honapnev(int n){
string[]nv={"Nem ltezik","Janur","Februr","Mrcius","prilis","Mjus","Jnius","Jlius","Augusztus",
"Szeptember","Oktber","November","December"};return(((n12)) ? nv[0] : nv[n]);
}
Az imnti plda meghatrozza egy tetszleges sorszm hnaphoz annaknevt.
IV.2. Struktra
Gyakran szksgnk van az eddigiektl eltradatszerkezetekre, amikor alerni kvnt adatunkat nem tudjuk egy egyszervltozval jellemezni. Elg,ha a taln legkzenfekvbb feladatot tekintjk: hogyan tudjuk a sk egy pontjtmegadni? Egy lehetsges megadsi md, ha a pontot mint a sk egy derk-szgkoordintarendszernek pontjt tekintem, s megadom az X s Y koor-dintkat.
A struktradefinils az ilyen feladatok megoldsa esetn lehetv teszi,hogy az sszetartoz adatokat egy egysgknt tudjuk kezelni.
A struktradefinci formja a kvetkez:
-
5/20/2018 Programozas Csharp Nyelven Konyv
48/200
IV. sszetett adattpusok
struct nv {
hozzfrs tpus mez
nevek;hozzfrs fggvnydefinci ;};
Hivatkozs egy mezre: vltoznv.meznvA struktrkon azonos tpus esetn az rtkads elvgezhet, gy ha pldul
as bazonos tpus struktra, akkor az a=brtkads szablyos, s az amindenmezje felveszi bmegfelelmezrtkeit.
Plda:
struct pont{
int x;int y;
};pont a;struct egy{
string name;int kor;
};egy[] c=new egy[10]; // 10 elemstruktra vektor
A fenti definci teljesen j, csak a hozzfrsi szint megadsnak hinybanminden mez privt, azaz a struktra mindkt adata csak bellrl lthat. Astruktra alaprtelmezett mezhozzfrse privt (private). Minden taghoz klnmeg kell adni a hozzfrsi szintet.
Struktra esetn a megengedett hozzfrsi szintek:
private csak struktrn bellrl rhetelpublic brki elrheti ezt a meztinternal programon bellrl (assembly) elrhet
Plda:
struct szemly{
public string nv;
-
5/20/2018 Programozas Csharp Nyelven Konyv
49/200
IV. sszetett adattpusok
public int kor;};
Az egyes mezkre hivatkozs formja:
Plda:
szemly st=new szemly();System.WriteLine( st.kor); // kor kirsa
Struktradefinci esetn a nyelv nem csak adatmez, hanem fggvnymezdefinilst is megenged. Azt a fggvnymezt, aminek ugyanaz a neve, mint astruktrnak, konstruktornak nevezzk. Paramter nlkli konstruktor nemdefinilhat, azt mindig a krnyezet biztostja. A struktra rtktpus adat, gy a
vermen s nem a dinamikus memriban jn ltre. ltalban elmondhat, hogya struktra majdnem gy viselkedik, mint egy osztly, de funkcionalitsttekintve megmarad a klnbztpus adatok trolsnl.
A struktrkkal kapcsolatosan rdemes megjegyezni hrom alapvet tulaj-donsgot:
Egy struktra adatmezt a definils pillanatban nem inicializlhatunk.
Plda:
struct alma
{ string nev="jonatn"; // fordtsi hiba
}
Struktra adatmezket a defaultkonstruktor nem inicializl. A kezdrtkbelltsrl, ha szksges, sajt konstruktorral vagy egyb belltsimddal kell gondoskodni.
Plda:
struct pont{
public int x,y;}pont p=new pont();p.x=2; p.y=4;
Br a struktra rtk tpus, azrt a newopertorral kell biztostani a sajtkonstruktorral trtn inicializcit. Ez ebben az esetben a vermen fogelhelyezkedni.
-
5/20/2018 Programozas Csharp Nyelven Konyv
50/200
IV. sszetett adattpusok
Befejezsl a struktra definilsra, hasznlatra, struktra vektorra nz-znk egy teljesebb pldt:
Plda:using System;struct struktra_plda{
public int kor;public string nv;
}class struktra_hasznl{
public static void Main()
{ struktra_plda sp=new struktra_plda();sp.kor=5;sp.nv="va";// struktra_plda vektorstruktra_plda [] spv=new struktra_plda[5];int i=0;// beolvasswhile(i
-
5/20/2018 Programozas Csharp Nyelven Konyv
51/200
IV. sszetett adattpusok
2.
Milyen tmbk ltrehozst tmogatja a C# nyelv?
3.
Mi a klnbsg a tmb s a struktra kztt?
4.
Hatrozzuk meg egy tmb legnagyobb elemt!
5.
brzoljuk struktra tpussal az alma legjellemzbb adatait (nv, szn,mret)! Ksztsnk 5 elemalmavektort!
-
5/20/2018 Programozas Csharp Nyelven Konyv
52/200
56
V. Utastsok
A programvezrls menett az utastsok szekvencija szabja meg. Ahogykorbban is lttuk, az opercis rendszer aMainfggvnynek adja t a vezrlst,majd a fggvnytrzs egyms utn kvetkez utastsait (szekvencia) hajtjavgre, ezutn tr vissza a vezrls az opercis rendszerhez.
Az utastsok fajti:
sszetett utasts
kifejezs utasts elgazs utasts ciklus utasts ugr utasts
V.1. sszetett utasts
Ahol utasts elhelyezhet, ott szerepelhet sszetett utasts is.Az sszetett utasts vagy blokk a {} zrjelek kztt felsorolt utastsok
listja. Blokkon bell vltozk is deklarlhatk, amelyek a blokkban loklisaklesznek. Blokkok tetszlegesen egymsba gyazhatk.
V.2. Kifejezs utasts
Az utasts formja:
kifejezs ;
Az utasts specilis formja az, amikor a kifejezs elmarad. Az ilyen utas-tst (;) res vagy nulla utastsnak nevezzk. Ennek termszetesen ltalbannagyon sok rtelme nincs. Az albbi plda egy vltoz rtkt nveli egyesvelegy ciklusban.
Plda:
int k=5;for(i=0; i
-
5/20/2018 Programozas Csharp Nyelven Konyv
53/200
V. Utastsok
V.3. Elgazs utasts
Az elgazsok kt tpusa hasznlhat, a ktfel s a sokfel elgaz utasts.A ktfel elgaz utasts formja:
if (kifejezs) utasts;if (kifejezs) utasts; else utasts;
Elszr a kifejezs kirtkeldik, majd annak igaz rtke esetn a kifejezsutni utasts, hamis rtke esetn az else ha van utni utasts hajtdikvgre.
Egymsba gyazs esetn az elsegat a legutbbi elsenlkli ifhez tartoz-nak tekintjk.
Plda:
if (c=='a')Console.WriteLine("Ez az a bet");
elseConsole.WriteLine("Nem az a bet");
Ha az igaz gon sszetett utastst hasznlunk, akkor utna pontosvessznem kell, illetve ha mgis van, az az if lezrst jelenten, s hibs lenne az
utastsunk az ifnlkli elsehasznlata miatt.Plda:
if (c=='a'){ Console.WriteLine("Ez az a bet");}
elseConsole.WriteLine("Nem az a bet");
A tbbirny elgazs utastsa, aswitchutasts formja:
switch (kifejezs) {case rtk1: utasts1 ;case rtk2: utasts2 ;default: utasts ;};
-
5/20/2018 Programozas Csharp Nyelven Konyv
54/200
V. Utastsok
Aswitchutni kifejezs nem csak egsz rtklehet, hanem szveg (string)is. Ha a kifejezs rtke a caseutn megadott rtkkel nem egyezik meg, akkor akvetkezcaseutni rtk vizsglata kvetkezik. Ha egy caseutni rtk azonosa kifejezs rtkvel, akkor az ez utni utasts vgrehajtdik. Ha egy caseg-
ban nincs egyrtelmutasts arra vonatkozan, hogy hol folytatdjon a vezr-ls, akkor fordtsi hibt kapunk.
A C++ nyelvet ismerk tudhatjk, hogy abban a nyelvben egy caseg vgtnem kellett vezrlstadssal befejezni, s ebbl gyakran addtak hibk.
Minden elgazsgat, mg a default gat is, ktelez valamilyen vezrls-tadssal befejezni! (break, goto, return)
Plda:
switch (parancs){
case "run":Run();break;
case "save":Save();break;
case "quit":Quit();break;
default:Rossz(parancs);break;
}
A casebelpsi pont utn csak egy rtk adhat meg, intervallum vagy tbbrtk megadsa nem megengedett, hiszen ezek az 'rtkek' gyakorlatilag egycmke 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 kettesetn");break;
default:Console.WriteLine("Egybknt");break;
};
-
5/20/2018 Programozas Csharp Nyelven Konyv
55/200
V. Utastsok
V.4. Ciklus utasts
A ciklus utastsnak ngy formja alkalmazhat a C# nyelvben, ezek awhile, a do, afors aforeachciklus utastsok.
V.4.1. while utastsA whileciklus utasts formja:
while (kifejezs) utasts;
Elszr a zrjelben lv kifejezs kirtkeldik, ha rtke igaz, akkor azrjeles kifejezst kvet utasts amit szoks ciklusmagnak nevezni ,vgrehajtdik. Ezutn jbl a kifejezs kirtkelse kvetkezik, igaz rtk esetn
pedig a ciklusmag vgrehajtsa. Ez az ismtls addig folytatdik, amg akifejezs hamis rtket nem ad.
Mivel az utasts elszr kirtkeli a kifejezst s csak utna hajtja vgre aciklusmagot (ha a kifejezs igaz rtket adott), ezrt a while ciklus utaststelltesztelciklusnak is szoks nevezni.
Plda:
while(true){Console.Writeline("Vgtelen ciklus!");Console.WriteLine("Ilyet ne nagyon hasznlj!");
}static void Main() // betnknti kirs{
string szveg[]="Szveg!";int i=0;while(i
-
5/20/2018 Programozas Csharp Nyelven Konyv
56/200
V. Utastsok
V.4.2. do utasts
Az utasts formja:
do utasts; while (kifejezs) ;
A ciklusmag a do s a whilekztti rsz vgrehajtsa utn kirtkeli akifejezst, s amg a kifejezs igaz rtket ad, megismtli a ciklusmag vgre-hajtst. A dociklust szoks htultesztelciklusnak is nevezni.
Plda:
string nv;do{
Console.WriteLine("Ki vagy?");nv=Console.ReadLine();
}while (nv!="Zoli");Console.WriteLine("Szia {0}!",nv);
doConsole.WriteLine("Biztos egyszer lefut!");
while(false);
V.4.3. for utastsAz utasts formja:
for (kifejezs1; kifejezs2; kifejezs3) utasts;
Ez az utasts egyenrtka kvetkezalakkal:
kifejezs1;while (kifejezs2) {
utasts;kifejezs3;};
Mindegyik kifejezs elmaradhat. Ha kifejezs2 is elmarad, akkor while(true)-knt tekinti a ciklust. A kifejezsek kztti pontosvessznem maradhat el.
A kifejezs1 tpusdefincs kifejezs utasts is lehet. Nagyon gyakran lt-hat forrskdban az albbi forma:
-
5/20/2018 Programozas Csharp Nyelven Konyv
57/200
V. Utastsok
Plda:
for (int i=0; i
-
5/20/2018 Programozas Csharp Nyelven Konyv
58/200
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();
-
5/20/2018 Programozas Csharp Nyelven Konyv
59/200
V. Utastsok
Console.WriteLine("Az adatsor elemei:");
// elemek kirsa
foreach (int i in adatok){
Console.WriteLine(i);}
}}/*Eredmny:1244332
50*/
V.5. Ugr utastsok
V.5.1. break utastsAz utasts formja:
break;
Hatsra befejezdik a legbelswhile, do, forvagyswitchutasts vgrehaj-tsa. A vezrls a kvetkezutastsra addik.
Plda:
int i=1;while(true) // ltszlag vgtelen ciklus{
i++;if (i==11) break; // Ciklus vge
Console.WriteLine( i);}
A breaka tbbirny elgazs (switch)utastsban is gyakran hasznlt, gykerlhetjk el, hogy a nem kvnt casegak vgrehajtdjanak.
V.5.2. continue utastsAz utasts formja:
continue;
-
5/20/2018 Programozas Csharp Nyelven Konyv
60/200
V. Utastsok
Hatsra a legbels while, for, do ciklus utastsokat vezrl kifejezsekkerlnek kirtkelsre. (A ciklus a kvetkez ciklusmag vgrehajtshozkszl.)
Plda:
int i=1;while(true) // 10 elemciklus{ i++;
if (i
-
5/20/2018 Programozas Csharp Nyelven Konyv
61/200
V. Utastsok
goto case 1;case 1:
egy();
goto default;default:
valami();break;
}
A goto utastsrl zrskppen meg kell jegyezni, hogy a strukturltprogramksztsnek nem felttlenl rsze ez az utasts, gy hasznlata sem java-solt. A knyv ksbbi pldaprogramjaiban sem fordul el egyszer sem ez azutasts.
V.5.5. using utasts
A using kulcssz ktfle nyelvi krnyezetben szerepelhet. Egyrszt n.direktva, knyvtri elemek, adott nvtr, osztly hasznlataknt. Ennek formja:
using nvtr_vagy_osztly;
Plda:using System; // a keretrendszer fnvternek hasznlata
// a C++ #include-hoz hasonlan megmondja a// fordtnak, hogy ennek a nvtrnek a tpusait is// hasznlja. Ezen tpusokat azrt enlkl is teljes// nvvel (System.Console) hasznlhatjuk
A msik eset a usingutasts. Egy ideiglenesen hasznlt objektum esetn ausingutasts utn a keretrendszer automatikusan meghvja az objektumDisposemetdust. A usingutasts alakja a kvetkez:
using (objektum) { utastsok;}
Plda:
using (Objektumom o = new Objektumom()){
o.ezt_csinald();}
-
5/20/2018 Programozas Csharp Nyelven Konyv
62/200
V. Utastsok
Ez a hasznlat az albbi kdrszletnek felel meg, a nem ismert nyelvi eleme-ket ksbb ismertetjk:
Objektumom o = new Objektumom();try
{o.ezt_csinald();}finally{
if (o != null) ((IDisposable)o).Dispose();}
ADisposeutastst s krnyezett bvebben a destruktorokkal kapcsolatban
rszletezzk.
V.5.6. lock utasts
Ha egy kritikus utasts blokk vgrehajtsakor egy referencia blokkolsravan szksg a biztonsgos vgrehajtshoz, akkor ezt a lockutastssal megtehet-
jk.A lock kulcssz egy referencit vr, ez jellemzen a this, majd utna
kvetkezik a kritikus blokk. Ennek formja:
lock(ref) utasts;
Plda:lock(this){
a=5; // biztonsgos}
A lockutastsnak, ahogy lttuk, a leggyakrabban hasznlt paramtere a this,ha a vdett vltoz vagy fggvnyutasts nem statikus. (Osztlypldnyok.)Ha statikus vltozkat vagy fggvnyutastsokat szeretnnk biztostani
(lockolni), hogy egyszerre csak egy vgrehajtsi szl tudjon hozzfrni, akkor alockreferencinak az osztly tpust kell megadni.
Plda:
class adatok{
static int szamlalo=0;public void mentes(string s)
-
5/20/2018 Programozas Csharp Nyelven Konyv
63/200
V. Utastsok
{lock(typeof(adatok)){
szamlalo++;Console.WriteLine("Adatments elindul!");for(int i=0;i
-
5/20/2018 Programozas Csharp Nyelven Konyv
64/200
68
VI. Fggvnyek
VI.1. A fggvnyek paramtertadsa
Ha egy fggvnynek adatot adunk t paramterknt, akkor alapveten ktklnbz esetrl beszlhetnk. Egy adat rtk szerint s hivatkozs szerintkerlhet tadsra. Az els esetben valjban az eredeti adatunk rtknek egymsolata kerl a fggvnyhez, mg a msodik esetben az adat cme kerl t-adsra.
VI.1.1 rtk szerinti paramtertadsltalnosan elmondhatjuk, hogyha nem jellnk semmilyen paramtert-
adsi mdszert, akkor rtk szerinti paramtertadssal dolgozunk. Ekkor afggvny paramterben, mint formlis paramterben, a fggvny meghvsakora hvrtk msolata helyezkedik el.
Tekintsk meg a kvetkezmaximum nevfggvnyt, aminek az a feladata,hogy a kapott kt paramtere kzl a nagyobbat adja vissza eredmnyknt.
Plda:class maxfv{
static int maximum(int x,int y){
return (x>y?x:y);}
static void Main(){
Console.WriteLine(maximum(4,3));
}}
Az gy megvalstott paramtertadst rtk szerinti paramtertadsnaknevezzk, a maximumfggvny kt (xsy) paramtere a hvskor megadott kt
paramtert kapja rtkl. rtk szerinti paramtertadsnl, hvskor konstansrtk is megadhat.
A fggvny hvsnak egy sajtos esete az, mikor egy fggvnyt sajt magahv meg. Szoks ezt rekurzv fggvnyhvsnak is nevezni. Erre pldaknt nz-zk meg a klasszikus faktorilisszmol fggvnyt.
-
5/20/2018 Programozas Csharp Nyelven Konyv
65/200
VI. Fggvnyek
Plda:
class faktor
{ static int faktorialis(int x){
return (x
-
5/20/2018 Programozas Csharp Nyelven Konyv
66/200
VI. Fggvnyek
VI.1.3. Fggvnyeredmny paramtere
A referencia szerinti paramtertadshoz hasonlan, a fggvnybeli vltozrtke kerl ki a hv vltozba. A klnbsg csak az, hogy ebben a vltozbana fggvny nem kap rtket.
Az eredmny paramtert az outkulcsszval definilhatjuk. A hvskor is aparamter el ki kell rni az outjelzt. A hasznlata akkor lehet hasznos, amikoregy fggvnynek egynl tbb eredmnyt kell adnia.
Plda:
using System;public class MyClass
{ public static int TestOut(out char i){
i = 'b';return -1;
}
public static void Main(){
char i; // nem kell inicializlni a vltoztConsole.WriteLine(TestOut(out i));
Console.WriteLine(i);}}
Kpernyeredmny:-1B
VI.1.4. Tmbk paramtertadsa
A nyelv a tmbt annak nevvel, mint referencival azonostja, ezrt egytmb paramtertadsa nem jelent mst, mint a tmb referencijnak tadst.Egy fggvny termszetesen tmbt is adhat eredmnyl, ami azt jelenti, hogyaz eredmny egy tmbreferencia lesz. Egy tmb esetben sincs msrl sz, mintegyszer vltozk esetben, a tmbreferencia egy referenciavltoz , rtkszerinti paramtertadsrl.
Az elmondottak illusztrlsra lssuk a kvetkezsematikus pldt.
-
5/20/2018 Programozas Csharp Nyelven Konyv
67/200
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 ltszikvektor[0]=5;
}
Ahogy a fenti pldn is lthat, a vektor paramterknt a referencijval ke-rl tadsra. Ez rtk szerinti paramtertadst jelent. Ha egy fggvnyben amutatott rtket (vektorelemet) megvltoztatom, akkor a vltozs a kls, para-mterknt 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 tads-nak lehetsgt. Ennek illusztrlsra nzzk a kvetkezpldkat:
1. plda:
using System;
class teszt{static public void feltlt(out int[] vektor){
// a vektor ltrehozsa, s inicializlsavektor = 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]);}
}
-
5/20/2018 Programozas Csharp Nyelven Konyv
68/200
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 mdostsarr[0] = 123;
arr[4] = 1024;// a tbbi elem rtke marad az eredeti}
static public void Main (){
// Vektor inicializlsaint[] 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.2. A Main fggvny paramterei
A parancsok, programok indtsakor gyakori, hogy a parancsot valamilyenparamter(ek)rel indtjuk. Ilyen parancs pldul a DOS echoparancsa, amelyparamtereit a kpernyre visszhangozza, vagy a typeparancs, mely a para-mterl kapott fjl tartalmt rja a kpernyre.
Ezeket a paramtereket parancssor-argumentumoknak is szoks nevezni.Amikor elindtunk egy programot (a Main fggvny az opercis rendszertltveszi a vezrlst), akkor hvskor aMainfggvnynek egy paramtere van. Eza paramter egy szveges (string)tmb, amelynek elemei az egyes paramterek.
A paramtertmbt gyakran argsnvre keresztelik.
-
5/20/2018 Programozas Csharp Nyelven Konyv
69/200
VI. Fggvnyek
A parancssor-argumentumok hasznlatra nzzk az imnt mr emltettechoparancs egy lehetsges megvalstst.
Plda:static void Main(string[] args){
int i=0;while (i
-
5/20/2018 Programozas Csharp Nyelven Konyv
70/200
VI. Fggvnyek
A Main fggvnyt, abban az esetben, ha a parancssori paramtereket nemakarjuk feldolgozni, a paramterei nlkl is deklarlhatjuk:
static void Main(){}
VI.3. Fggvnyek vltoz szm paramterrel
A feladatmegoldsok sorn gyakran elfordulhat, hogy elre nem tudjuk
eldnteni, hny elemet kell a fggvnynek feldolgoznia. Teht nem tudjuk, hogyhny paramterrel ksztsk el a kvnt fggvnynket. A params kulcsszsegtsgvel egy vektorparamtert definilhatunk a fggvnynek, ami ezeket a
paramtereket tartalmazza majd.Nzznk nhny pldt ilyen fggvny definilsra, majd a hasznlatra.
Plda:
using System;public class vltparamter{
public static void intParamterek(params int[] list){
for ( int i = 0 ; i < list.Length ; i++ )Console.WriteLine(list[i]);
Console.WriteLine();}
public static void objParamterek(params object[] list){
for ( int i = 0 ; i < list.Length ; i++ )Console.WriteLine(list[i]);
Console.WriteLine();}
public static void Main(){
intParamterek(1, 2, 3);objParamterek(1, "fradi", "teszt", 3.5);int[] myarray = new int[3] {10,11,12};intParamterek(myarray);
}}
-
5/20/2018 Programozas Csharp Nyelven Konyv
71/200
VI. Fggvnyek
Az eredmny a kvetkezlesz:12
3
1fraditeszt3.5
101112
Egy vltoz paramterszm fggvnynek lehetnek fixen megadottparamterei is. A fixen megadott paramtereknek ktelezen meg kell elznika vltoz paramtereket. A kvetkezplda egy ilyen fggvnydefincit mutat.
Plda:
using Systemclass parameters{
public static void valtozo(int x, params object[] list){
Console.WriteLine(x);foreach (object o in list)
Console.WriteLine(o);}
public static void Main(){
valtozo(25, "alma", "barack","szilva");}
}
Eredmnyl kapjuk a fggvny paramtereinek kirst egyms al.
VI.4. Fggvnynevek tdefinilsa
Egy-egy feladat esetn gyakorta elfordul, hogy a megoldst ad fggvnytklnbztpus vagy klnbzszm paramterrel jellemezhetjk. Termszetesenaz ezt megold fggvnyt azonos nvvel szeretnnk elkszteni minden esetben, hiszez lenne a legkifejezbb. A lehetsget gyakran fggvny overloading nvvel ismegtalljuk az irodalomban, vagy a polimorfizmus kapcsn kerl megemltsre.
-
5/20/2018 Programozas Csharp Nyelven Konyv
72/200
VI. Fggvnyek
Hatrozzuk meg kt szm maximumt! Ha el szeretnnk kerlni a tpus-konvertlst mondjuk egsz tpusrl valsba s fordtva, akkor kln azegsz s kln a vals szmok esetre is meg kell rnunk a maximum fgg-vnyt.
Knyelmetlen dolog lenne, ha mondjuk egszmax s valsmaxnven kel-lene megrni a kt fggvnyt. Mindkt esetben szeretnnk a maximumfggvnynevet hasznlni, hogy ne neknk kelljen eldnteni azt, hogy azegszek vagy valsak maximumt akarjuk-e meghatrozni, hanem dntse el afordt a paramterlista alapjn automatikusan, hogy melyik fggvnyt is kellaz adott esetben meghvni.
Plda:
// vals maximum fggvnydouble maximum(double x,double y){
if (x>y)return x;
elsereturn y;
}
// egsz maximum fggvnyint maximum(int x,int y)
{ if (x>y)return x;
elsereturn y;
}int a=2,b=4;double c=3.123, d=2;Console.WriteLine(maximum(4.1,2)); // vals hvsConsole.WriteLine(maximum(4,2)); // egsz hvs
Console.WriteLine(maximum(a,b)); // egsz hvsConsole.WriteLine(maximum(c,d));
Meg kell jegyezni, hogy ezt a tulajdonsgot sok nyelvben fggvnysablon(template)tulajdonsg segtsgvel elegnsabban oldhatnnk meg, de a jelenlegiC# ezt nem tmogatja.
-
5/20/2018 Programozas Csharp Nyelven Konyv
73/200
VI. Fggvnyek
VI.5. Delegltak, esemnyekAhogy korbban is sz volt rla, a biztonsgosabb programkd ksztsnek
rdekben a mutat aritmetika a C# nyelvben nem engedlyezett. Ebbebeletartozik az is, hogy a fggvnymutatk sem lehetnek kivtelek.
Ez utbbi esetben viszont olyan nyelvi tulajdonsgok nem implementl-hatk, mint pldul egy menponthoz hozzrendelt fggvny, amit a menpontvlasztsa esetn kell vgrehajtani. Ezen utbbi lehetsget hivatott a deleglttpus biztostani. Ez mr csak azrt is fontos, mert tbbek kztt a Windows
programozs callbackjellemzparamtere is ezt hasznlja.A C++ krnyezetben ezt a lehetsget a fggvnymutat biztostja.A deleglt valjban egy fggvnytpus-definci, aminek alakja a kvet-
kez:
delegate tpus delegltnv(tpus paramternv,);
A deleglt referencia tpus. Ha paramtert is megadunk, akkor a paramternevt is meg kell adni.
Plda:
delegate int pelda(int x, string s);
Az elbbi pldban teht a peldadeleglt tpust definiltuk. Ez olyan fgg-vnytpus, amelyiknek egy egsz s egy szveg paramtere van, s eredmnylegy egsz szmot ad.
Egy deleglt objektumnak vagy egy osztly statikus fggvnyt, vagy egyosztly pldnyfggvnyt adjuk rtkl. Deleglt meghvsnl a hagyo-mnyos 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;}
}
-
5/20/2018 Programozas Csharp Nyelven Konyv
74/200
VI. Fggvnyek
class foprogram{
delegate i
top related