C# nyelv alapjai Krizsán Zoltán 1 Általános Informatikai Tanszék Miskolci Egyetem Objektumorientált programozás C# alapokon tananyag
Tartalom Bevezetés Lokális változó Utasítások
Szójáték Why do all real Java programmers wear glasses? Because they don't C#.
C# formalizmusa A C, illetve az annak b vítéseként deniált C++ szintaktikájával nagyon rokon. A továbbiakban az alapelemeket a C nyelvvel összehasonlítva ismertetjük. El ször csak a C# nyelv legegyszer bb elemeivel foglalkozunk. A leírás a legtöbb esetben nem teljes, de a C nyelv ismeretében egyszer programok írásához elegend. A hiányzó információkat a kés bbiekben pótoljuk.
C# program A C# program szigorúan osztályok halmaza. Végrehajtható kód csak osztály metódusában fordulhat el. Egy alkalmazás belépési pontja egy olyan osztály, amelyben van egy public static min sítés Main nev metódus. Ha több van, akkor meg kell jelölni egy osztályt. A fenti fogalmak (osztály, metódus, min sít k) pontos jelentésére a kés bbiekben kitérünk. Minden utasítást pontos vessz zár. A fájl neve és az osztály neve nem kell, hogy megegyezzen, s t egy osztály több fájlban is lehet, és egy fájlban több osztály. A kiterjesztés megállapodás szerint.cs. Fordítás a csc.exe xxx.cs nyelvi fordítóval. Eredménye a xxx.exe vagy xxx.dll (kis várakozás után fut, hogy miért arról kés bb lesz szó)
Azonosító A C# Unicode karakterkészletet használja, tehát akár ékezetes azonosítókat is használhatunk. Az azonosító valamilyen elemet azonosít be (változó, konstans, metódus,...) bet vel kezd d bet vel vagy számmal folytatódó karaktersorozat. Az _ és a $ is a bet k közé sorolandó. A bet k bármelyik karakterkészletb l származhatnak. Az azonosító hossza tetsz leges. A C# is kis- és nagybet érzékeny (case sensitive). Kulcsszavak, valamint a foglalt szavak szavak nem lehetnek azonosítók.
Kulcsszavak, foglalt szavak abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false nally fixed oat for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual void volatile while
Kifejezés 1 vagy több operandus és 0 vagy több operátor Literál: olyan konstans, melynek nincs neve. Operandus lehet bármilyen értéket adó valami: lokális változó, adattag, literál, konstans, fv. hívás visszatérési értéke. Kiértékelés menete nem változott.
Literál Konstans, melynek nincs neve. Logikai értékek: true vagy false. A C-vel teljesen egyez módon használandók: Egész konstans Lebeg pontos konstans Karakter konstans (az escape szekvenciák is!) Szöveg konstans (csak Unicode szöveget is tartalmazhat) A szöveg konstanst a fordító automatikusan String típusúként kezeli (magyarázat majd kés bb).
Megjegyzés Mint a C-ben: /* Szöveg */ Egysoros: // Innent l a sor végéig komment Dokumentációs /// Tetsz leges szöveg (a fordító xml-t hoz létre)
Lokális változó Alap tulajdonságok Deníciója csak metóduson belül. Nincs globális változó! Formája mint a C-ben, beleértve a kezd értékadást is. Egyszer típusú lokális változó deníciója egyben helyfoglalást is jelent.
Lokális változó C és C# lokális változó használatának különbségei Különbségek: Változó deníció egy metóduson belül bárhol lehet (nem csak blokk elején). A deníció tehát C#-ban végrehajtható utasítás! Következmény: az inicializáló kifejezés (ha van) tetsz leges kifejezés lehet, csak a kifejezés értékének kell a deníció típusával kompatibilisnek lennie.
Lokális változó Természetesen a változó csak a deníció után használható. A deníció hatásköre a deníciót tartalmazó blokk végéig tart. Kivétel: a for utasításban foglalt els kifejezésben található deníció érvényességi köre a ciklusmag!
Lokális változó Példa a lokális változó hatáskörére for (int index=1; index<8; index++) { System.out.println(index); byte i = index+65; System.out.println(i); } i és index egyaránt lokális a ciklusmagra nézve (tehát azon kívül nem használható!)
Lokális változó Példakód magyarázata Mivel a i deníciója ténylegesen a ciklusmag belsejében van, így a ciklusmag minden végrehajtásakor létrejön, a végén pedig megsz nik. Az index az t tartalmazó kifejezés kiértékelésekor létrejön, és a ciklusból való kilépéskor megsz nik.
Lokális változó Hibaforrás Inicializálatlan lokális változó értéke határozatlan! Figyelem! Inicializálatlan változó használatát általában a fordító felismeri, és hibajelzéssel "jutalmazza". a kés bbiekben "osztály változókról" és "példány változókról" (adattagokról) is lesz szó!
Utasítás statement labeled-statement declaration-statement embedded-statement block empty-statement expression-statement selection-statement iteration-statement jump-statement try-statement checked-statement unchecked-statement lock-statement using-statement yield-statement
Deklarációs utasítás A lokális változó és konstans deklaráció utasítás lett, így nem kell a blokk legelején használni. Hatáskörük az a blokk, ahol bevezették (annak a végén megsz nik). Csak blokkon belül.
Vezérl utasítások Lényegében megegyeznek a C utasításaival. Különbségek: Az if, while, do utasításokban a feltétel csak logikai kifejezés lehet. A for utasításban a második kifejezés csak logikai kifejezés lehet. A switch utasításban a szelektor sbyte, byte, short, ushort, int, uint, long, ulong, char, string típusú kifejezés lehet.
Szelekciós utasítás switch (i) { default: CaseAny(); break; case 1: CaseZeroOrOne(); goto default; case 0: CaseZero(); goto case 1; } if (x) if (y) F(); else G(); // G() meghívódik, ha x igaz és y nem, else a hozzá legközelebb állóhoz
foreach utasítás foreach ( type identier in expression ) embedded-statement type identier : iterációs változó csak olvasható (fordítási hiba, ha változtatni akarjuk, nem lehetnek ref out paraméterek) csak beágyazott utasításban használható expression: eredménye egy gy jtemény kell legyen", aminek alaptípusa type System.Collections.IEnumerable implementálja van GetEnumerator metódusa Az identier rendre felveszi a gy jtemény értékeit és lefuttatja a beágyazott kifejezést.
foreach utasítás foreach (V v in x) embedded-statement { E e = ((C)(x)).GetEnumerator(); try { V v; while (e.movenext()) { v = (V)(T)e.Current; embedded-statement } } nally {? // Dispose e } }
foreach utasítás III using System; class Test { static void Main() { double[,] values = { {1.2, 2.3, 3.4, 4.5}, {5.6, 6.7, 7.8, 8.9} }; foreach (double elementvalue in values) Console.Write("{0} ", elementvalue); Console.WriteLine(); } }
Ugró utasítások jump-statement: break-statement continue-statement goto-statement (ugrás címkére, nem javasolt) return-statement throw-statement (kivétel kezelés, majd kés bb)
Túlcsordulást szabályzó utasítások Integrális típusok m ködését befolyásolják aritmetikai operátorainak ++ - (unary) + - * / implicit numerikus konverziót van operátor megfelel je is checked bekapcsol (var rá fordító kapcsoló is /checked) unchecked kikapcsol
Túlcsordulást szabályzó utasítások példa short x = 32767; short y = 32767; short z = 0; // Max short value try { z = checked((short)(x + y)); } catch (System.OverflowException e) { System.Console.WriteLine(e.ToString()); }
Kölcsönös kizárás utasítás lock-statement: lock ( expression ) embedded-statement 1. Bemegy a kritikus szakaszba (egyedül), zárolja mások belépését. 2. Lefuttatja a beágyazott kifejezést. 3. Kilép, és felengedi a zárolást. System.Threading.Monitor.Enter(expression); try { embedded-statement } nally { System.Threading.Monitor.Exit(expression); }
Használó utasítás 1. Megkaparint 2. Használ 3. Felszabadít using (ResourceType resource = expression) embedded-statement { ResourceType resource = expression; } try { embedded-statement } nally {? // Dispose of resource }
Összefoglalás Jelent s változások a C szintaktikához képest (OOP kívül is). Kényelmesebb használat. Több szabály. Szigorúbb, mint a C. Számos egyszer sített utasítás.