Ez a dokumentum egy előző változata!
Tartalomjegyzék
c# (c-sharp)
Paradigmák:
A Microsoft által kifejezetten a .NET framework-re fejlesztett ECMA és ISO szabványosított erősen típusos teljesen objektumorientált1) programozási nyelve.
A nyelv struktúrájának bemutatása:
1. using System; 2. namespace SajátNévterem { 3. class PéldaOsztály { 4. public static void Main() 5. { 6. Console.WriteLine("Hello VMG!"); 7. } 8. } 9. }
A C# program objektumok, struktúrák, adattípusok definícióniak halmazából áll. Az objektumorientált nyelvek egységbezárás elvét az osztályok valósítják meg. Egy forrásfájlban több osztály is definiálható, és egy osztály több állományba is szétbontható (.NET 2.0 partial class). Az osztályok állapotaikat az adattagokon őrzik és metódusaikkal változtatják.
A .NET keretrendszerben minden futtatható file-nak rendelkeznie kell egy belépési ponttal (4.sor). C#-ban a belépési pont tulajdonságai:
- metódusának neve:
Main
(a nyelv case-sensitive) - a
Main()
metódus kötelezően statikus metódus - visszatérési értéke
void
vagyint
- paraméter/argumentum listája opcionálisan:
string[]
típusú - a Main metódus láthatósága kötelezően
public
(!ez eltér a c# default metódus láthatóságtól, ami aprivate
)
Egy alkalmazás a Main() metódusból kilépésig fut. (7.sor)
Az osztályokat (3.sor) (és egyéb adattípusokat) névterekbe lehet szervezni (2.sor). Egy névtör több file-t, és egy forrás több névteret is lefedhet. A névteret (a névtéren belüli osztályok egyszerűbb használatához) az adott programforráson belül a using
kulcsszóval lehet igénybe venni. (Példánkban a Console osztály WriteLine() metódusához az 1. sorban szereplő utasítás.) A névterek using kulcsóval való használatba vétele nem kötelező, közvetlen hivatkozhatunk is rá: System.Console.WriteLine(„helló c# világ!”);
Adatszerkezetek
Műveletek
Értékadás
Jobbról balra történik, és más nyelvekhez hasonlóan a bal oldalon egyéb művelet nem lehet.
int i, j, k; i = j = k = 10; //k legyen 10, j legyen k (ami 10), i legyen j
Aritmetikai műveletek
- additív többváltozós (+,-),
- multiplikatív többváltozós (*,/,%)
- additív egyváltozós (++, –) (prefix, postfix)
i = j + 10 - k + 1; // 11 k = 3 * j; // 30 i++; // 12 --k; // 29
Összetett műveletek
Egy aritmetikai és az értékadó (egyenlőségjel) operátorból képezhető. A számítási szabály így változó <aritmetikai operátor>= változóÉrték
jelentése változó = változó + változóÉrték
+=, -=, *=, /=, %=
j -= 3; // j = j - 3; k %= 2; // k = k % 2;
Összehasonlító, viszonyító műveletek
relációs operátor: <, > ==, !=, >=, ⇐
eredményük: {true, false} általában az elágazásokban használjuk (feltételes log. műveletek)
Feltételes logikai műveletek
Az egyetlen háromváltozós művelet a feltételes művelet.
int x = 121243; //[változó] = ( [feltétel] ) ? [érték, ha igen...] : [érték,ha nem...]; bool páros = ( x % 2 == 0 ) ? true : false ;
Típusműveletek (as,is)
Műveleti sorrend
A műveleti sorrend kötött
1. elsődleges: ().[] x++ x-- new typeof sizeof checked unchecked 2. egyváltozós 3. multiplikatív 4. additív 5. eltolási 6. viszonyító 7. egyenlőségi 8. logikai és 9. logikai xor 10. logikai or 11. feltételes and 12. feltételes or 13. feltételes művelet 14. értékadás
Egymásbaalakíthatóság, hatókörök
Hatókör: egy változó jellemzően csak egy {} blokkon belül él.
int x; { int y = 0; y++; x = y; } x++; // viszont itt y-ra már nem hivatkozhatunk for(int i = 0; i<10; i++) { // i a ciklusmagon belül elérhető, de } // a cikluson kívül már nem, a GC fel fogja szabadítani az általa foglalt memóriát.
ez a szakasz hiányos
implicit konvertálás: célszerűen bővebb típusra, ne dobjon kivételt, különben
explicit konverzió: ez a type cast
ehelyett használható az as
operátor. Itt sikertelen konverzió esetén nem kapunk kivételt, hanem egyszerűen nulla értéket.
A konverzió sikeressége előre is eldönthető, az is
operátor használatával. Ha típuskompatibilis, akkor igaz, ha nem hamis értéket kapunk.
Itt jegyzünk meg két fontos dolgot:
- lusta (mohó) algoritmus
- saját típusunkon használandó operátorok is definiálhatók
Program menetének szabályozása
Vezérlési szerkezetek
szelekció, elágazás((szokásos elnevezés még: kiválasztás))
a program menete a megadott feltételeket teljesítő ágban fut tovább
- kétágú szelekció: egy logikai kifejezéstől (feltételtől) függ, hogy melyik tevékenységet hajtjuk végre. Nem kötelező megvalósítani a „különben” ágat és tetszőleges feltételek és utasításblokkok egymásba ágyazhatók.
int i = 2; if ( i <= 0 ) { // ha igaz a feltétel, hogy az i változó értéke kisebbegyenlő, mint 0, akkor... System.Console.WriteLine("i nemnegatív"); } else { // különben pedig... System.Console.WriteLine("i természetes szám"); }
- többágú szelekció típusok: egy kifejezés értékétől függő elágazás. Ha egy kifejezés több értékcsoportba is beleesik, akkor az előrébbvalósági sorrend definiálja a működést. (vö. struktogrammok, ahol ez definiálatlan)
if (i==2) { // ha i éppen kettő } else if (i>=3) { // ha i 3 vagy nála nagyobb } else { // különben (se nem kettő, se nem három vagy háromnál nagyobb) // tehát ha 3-nál kisebb, de nem kettő }
// Megjegyzés: a "break" kulcsszó elhagyása hiba! string szöveg = ""; switch (szöveg) case 'Macska': // ha Macska a szöveg változó értéke break; case 'Nyúl': break; default: // ha egyik sem break;
iteráció (bejárások)
Más néven ciklusban, vagy ismétlési szerkezetben egy feltételtől függően végzünk utasítássorozatokat. Az ismétlendők alkotják a ciklusmagot.
- elöltesztelős ciklus (pl. eldöntési tétel)
while ( futási feltétel ) { //ciklusmag }
- hátultesztelős ciklus (Figyelem! c#-ban az elöltesztelős ciklussal egyezően a futási feltételt adjuk meg a blokk végén.): Olyan esetben használjuk, ahol a ciklusmagnak egyszer biztosan le kell futnia.
do { //ciklusmag } while ( futási feltétel ) ;
- for ciklus: sokszor tömbök bejárására használjuk
for ( [ciklusváltozók inicializálása] ; [futási feltétel] ; [ciklusváltozók módosítása] ) { }
Példa:
int[] Tömb = new int[2] { 2,3 }; int i = 0; while ( i < Tömb.Length && !(Tömb[i]%7==0) ) ++i; string kiír = (i<Tömb.Length) ? "van 7-tel osztható elem" : "hamis feltétel"; System.Console.WriteLine(kiír);