[[:oktatas:programozás:csharp|< CSharp]] ====== CSharp ====== Az alábbi leírás Visual 2010 C# Express szoftveren alapszik. Az itt található anyag jelenleg 2010 tavaszi tanfolyam első napját fedi le. Az anyag csak a tanfolyam ezen napján elhangzottakat tükrözi! .Net framework kell a programok futtatásához * Az XP alapból egyiket sem tartalmazza * 3.0-át tartalmazza a Windows Vista * 3.5-át tartalmazza a Windows 7 ===== Bevezetés ===== A C# kisbetű nagybetű érzékeny Mentések helye: Dokumentumok\Visual Studio\Projects ===== Helló Világ ===== Visual 2010 C# Express alapból: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hellovilag { class Program { static void Main(string[] args) { Console.WriteLine("Valaiékezetőő"); Console.ReadLine(); } } } Futtatás F5 vagy eszköztáron. ===== Változók ===== Unicod rendszerű a nyelv ezért ékezetek is lehetnek a változónevekben. * Egyszerű változók * Objektum típusú változók * Osztály típusú változó ==== Egyszerű típusú változók ==== Például egész változók * int szám = 0; ==== Osztály típusú változó ==== * Például: Dátum tárolása Először létre kell hozni: DateTime dátum = new DateTime(2010, 6, 28); Console.WriteLine(dátum.ToLongDateString()); A metódus minden ország saját formátumához igazodik. ===== Típusok ===== ==== Egész ==== int szám = 0; szám = 5 + 6; szám = szám + 5; ==== Szöveg ==== string szöveg = ""; szöveg "egy" + "kettő"; Console.WriteLine(szöveg); ==== Bináris típus ==== bool bináris = true; bináris = !bináris; //megfordítottuk Console.WriteLine(bináris); ==== Törtszámok ==== * float * double Példa: double lebegő = 1.0; lebegő = lebegő / 3; Console.WriteLine(lebegő); ===== Konstansok ===== Azt vállaljuk, hogy nem változtatjuk az értékét. const double lebegő = 1.0; ===== Enum ===== Felsorolt típusok enum Fajta { Dobermann = 1, Rotweiler = 2 }; Konkrét példa using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hellovilag { class Program { enum Fajta { Dobermann, Rotweiler }; static void Main(string[] args) { Fajta kutya = Fajta.Dobermann; Console.WriteLine("Valami ékezetőő"); Console.ReadLine(); } } } Az egyenlőség jel után szóköz, megjelenik a Fajta típus. ===== Operátrok ===== ==== Értékadó operátorok ==== szám = szám + 5 rövidebben: szám += 5; szám = szám / 5; helyett: szám /= 5; ==== Logikai operátorok ==== ^ Operátor ^ Jelntés ^ | == | egyenlőség vizsgálat | | | | vagy (mohó)| | & | és (mohó)| | || | vagy (lusta)| | && | és (lusta)| // Szorgos (Mohó) bináris = true | false ; bináris = ture & false; // Lusta bináris = true || false; bináris = true && false; ==== Egy operandusú operátorok ==== ^ Operátor ^ Jelntés ^ | ++ | 1-gyel növeli a változó értékét | ==== Három operandusú operátor ==== Console.WriteLine(bináris ? "igaz" : "hamis"); ===== Kommentek ===== // Megjegyzés ===== Escape karakterek ===== A escape karaktereket visszaperjellel vezetjük be. * sortörés \n ===== Hibakövetés ===== * Piros aláhúzás: szintaktikai hiba * Zöld aláhúzás: szemantikai hiba * Pl. sosem használunk egy változót * Kék aláhúzás: Futtatáskor észlelet hibák ===== Tömbök ===== int[] tömb = new int[100]; tömb[3] = 15; A tömbök indexelése 0-val kezdődik. Egy int[100] esetén a legnagyobb index 99 ===== Listák ===== Egy láncolt lista létrehozása List lista = new List(); Hozzáfűzés a listához: lista.Add(15); Törlés a listából: lista.Remove(15); Ha többször is szerepel benne, csak az elsőt törli. Címzés mint a tömböknél: szám = lista[0]; Törlés index szerint: lista.RemoveAt(1); ===== Szelekció ===== ==== if ==== if (feltétel) tevékenység; if (feltétel) tevékenység; else tevékenység2; Ha feltétel igaz, akkor teszünk valamit. Ha hamis akkor mást. if (bináris == true) { Console.WriteLine("igaz"); } Két elágazásra példa if (bináris == true) { Console.WriteLine("igaz"); } else if (szám > 10) { Console.WriteLine("nagy"); } Három elágazásra példa: if (bináris == true) { Console.WriteLine("igaz"); } else if (szám > 10) { Console.WriteLine("nagy"); } else { Console.WriteLine("egyébként"); } Az else if esetén kiveszem az else részt akkor az if-től egy önálló if blokk következik ==== switch ==== Csak egyszerű változókat fogad el. int szám = 3; switch(szám) { case 1: Console.WriteLine("Egy"); break; case 2: Console.WriteLine("Kettő"); break; case 3: goto case 2; default: Console.WriteLine("Egyik sem"); break; } ===== Iteráció ===== ==== for ==== A for ciklussal növekményes ciklust tudunk létrehozni. for (kezdő_érték; feltétel; növekmény) for ( int i = 0; i < 10; i++) { //utasítások } ==== while ==== Amíg a kifejezés igaz addig fut while(kifejezés) { } Egy végtelen ciklus: while(true) { } ==== do while ==== int i = 1; do { Console.WriteLine("Egyik sem"); i++; }while (i < 10); ==== foreach ==== Egy lista vagy tömb elemeit vesszük Lista létrehozása és végigjárása List lista = new List(); lista.Add(15); lista.Add(10); lista.Add(20); lista.Add(42); lista.Add(30); foreach(int i in lista) { Console.WriteLine(i); } Szöveges tömb létrehozása és bejárása string[] tömb = new string[3]; tömb[0] = "Máté"; tömb[1] = "Márk"; tömb[2] = "Lukács"; foreach(string str in tömb) { Console.WriteLine(str); } ===== Build ===== Csak fordítás ===== Függvények ===== Eddig csak Main nevű függvényt használtunk. Módosító_szavak Visszatérési_érték Név Paraméterek ==== Operátor túlterhelés ==== Ugyanazon a néven több függvény is lehet, ha különbözik a paraméterük. ^ Típus ^ Jelentés ^ | void | Nincs vissaztérési érték | ==== Paraméter típusok ==== * érték szerinti * Referencia * Out paraméter ==== Módosítók típusai ==== * public * külsőleg hívható * protected * védett csak a saját osztályok és azok leszármozattai hívhatják * private * leszármazottak sem hívhatják ==== Static módosító ==== === Statikus === Nem kell létrehozni példányt === Nem statikus === Létre kell hozni egy példányt a használatához ==== Összeadó függvény példa ==== using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hellovilag { class Program { static void Main(string[] args) { Console.WriteLine(Összead(3,2)); Console.ReadLine(); } static public int Összead(int a, int b) { int érték = a + b; return érték; } } } ==== Több értéket szeretnénk visszakapni ==== using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hellovilag { class Program { static void Main(string[] args) { Console.WriteLine(Összead(3,2)); int eredmény; Szoroz(1, 2, out eredmény); Console.WriteLine(eredmény); Console.ReadLine(); } static public int Összead(int a, int b) { int érték = a + b; return érték; } public static void Szoroz(int a, int b, out int c) { c = a * b; } } } ===== Osztályok ===== Az osztály egy egész, az objektum egy konkrét példány ==== Öröklés, származtatás ==== labda osztály Két leszármazott * amerikai_labda * szimpla_labda Minden objektumnak egyetlen közös őse van: Object ==== Osztályok tartalma ==== * Metódusok * Osztály szintű változók ==== Objektum példa ==== using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hellovilag { class Program { static void Main(string[] args) { Console.ReadLine(); } class Labda { public void Rúg(); private void Felfúj(); } } } ==== Öröklésre, származtatásra példa ==== using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hellovilag { class Program { static void Main(string[] args) { Labda labda; labda = new AmerikaiLabda(); labda.Rúg(); Console.ReadLine(); } abstract class Labda { abstract public void Rúg(); //abstarct public void Felfúj(); } class AmerikaiLabda : Labda { public override void Rúg() { Console.WriteLine("Rúg"); } } class EurópaiLabda : Labda { public override void Rúg() { Console.WriteLine("Csapva"); } } } } ==== Tulajdonságok ==== Lehetővé teszik érték lekérdezést kontrollált módon. Példa kedvéért a labdának adjuk egy szín tulajdonságot. prop begépelve kódkiegészítő ablak ugrik elénk. Két tab-ra tulajdonságot beírja. class AmerikaiLabda : Labda { public int Méret { get; set; } public override void Rúg() { Console.WriteLine("Rúg"); } } Létrejön egy int típusú változó az objektumban. ==== Objektumok típusai ==== ==== Objektumok konvertálása ==== * Meghívok egy metódust, ami átkonvertálja * Automatikus konvertálás -> Kasztolás === Konvertálás metódussal === Például szöveg konvertálása egésszé: int a = int.Parse("5"); === Kasztolás === int a = 5; double b = (double)a; A kasztolás osztályokon is működik ===== Hibakezelés ===== * kivételkezelés * debugolás ===== Kivételkezelés ===== Speciális kivételosztályokat használunk Van egy kivétel alaposztály, ebből több fajta kivétel van származtatva. Szabványosan tudjuk kezelni a programban fellépő hibákat. A cél az összeomlás nélküli működés. Kivételt úgy kezeljük, hogy "elkapjuk" ==== Kivétel dobása ==== throw throw new Exception Eddig csak annyit ír ki, hogy hiba. Ezért üzenet írunk: throw new Exception("Nem működik a képernyő"); Felveszünk egy újabb metódust, amiben elhelyezzük az eldobást: static void HibásUtasítás() { // valami kód throw new Exception("Nem működik a képernyő"); } ==== Kivétel elkapása ==== Meg kell saccolnunk hol lehet majd hiba. Ott try utasítással elkapjuk a kivételt: Kapd el: try Ha elkaptál egy kivételt tedd az e változóba: catch(Exception e) try { HibásUtasítás(); } catch(Exception e) { Console.WriteLine("Hiba! " + e.Message); Console.ReadLine(); } ==== Final ==== Érzékeny erőforrások esetén le kell zárni azt, fel kell oldani a foglalását. Memóriaszivárgás léphet fel az el nem engedett erőforrások kapcsán. try { HibásUtasítás(); } catch(Exception e) { Console.WriteLine("Hiba! " + e.Message); Console.ReadLine(); } finally { //Erőforrások lezárása } Ha nem volt hiba a catch részt átugorjuk és a finallay rész mindenképpen végrehajtásra kerül. A kivételek típusa alapján szétválaszthatók: try { HibásUtasítás(); } catch(FormatException e) { Console.WriteLine("Hiba! " + e.Message); Console.ReadLine(); } finally { //Erőforrások lezárása } A példában formátum kivétel esetén írjuk ki az adott hibaüzenetet. ===== Debuger ===== A memóriát lépésről lépésre képes vagyok kezelni. A programba bele kell fordítani a debugolási információkat. A Visual Studió ezeket automatikusan bele teszi. Release módban nem kerülnek bele a kódba a debug információk, de gyorsabban fut. ==== BreakPoint ==== A szerkesztő ablak baloldalán kattintok breakpointot szúrok be. A program mindig megáll amikor a futtatás az adott kódrészhez ér. ==== Watch ==== Változó felett: Jobb gomb -> AddWach ==== Stack ==== A program végrehajtása során hívásokat tároljuk itt ==== Immediate Window ==== A kód szerkesztése nélkül tudunk kódrészeket beleírni. Például a lista egyik elemét töröljük. ==== Végrehajtás lépésenként ==== Program futásának követése F10 gombot nyomogatva léptetni tudjuk a programot. Nehézség több szálas programok debugolásánál fordul elő. ===== Fájlkezelés ===== Amivel dolgozunk * Olvasó objektum * Adatforrás objektum Hasonlóan írunk olvasunk fájlokba, memóriába. ==== Fájl megnyitása olvasásra ==== using System; using System.IO; namespace hellovilag { class Program { static void Main(string[] args) { StreamReader reader = new StreamReader(new FileStream(@"c:\test.txt", FileMode.Open)); while (!reader.EndOfStream) { Console.WriteLine(reader.ReadLine()); } reader.Close(); Console.ReadLine(); } } } Ha egy Sztring elé @ karaktert teszünk az escape szekvenciák nem kerülnek behelyettesítésre. @"c:\test.txt" ===== Windows Formok ===== Különbségek az eddigiekhez: * Eseményvezérelt módon dolgozunk. * Űrlapokkal dolgozunk Minden amit használunk egy-egy osztály. Visual Studoban: Új projekt -> WindowsFormsApplication View -> Other Windows -> Solutions Exploler View -> Other Windows -> ToolBox Rajzszögre kattintunk View -> Other Windows -> Properties Window Előkészítés Form1 Load esemény namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } } } * sender ki küldte az objektumot * e paraméterek mbox tab tab MessageBox.Show("Test"); Egy komplett program: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { VálasztócomboBox.Items.Add("Körte"); VálasztócomboBox.Items.Add("Alma"); VálasztócomboBox.Items.Add("Barack"); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show(VálasztócomboBox.Text); } } } ===== Konkrét példa megoldása ===== StreamReader reader = new StreamReader(new FileStream(@"c:\adat.txt", FileMode.Open)); string str; string[] stomb; while (!reader.EndOfStream) { str = reader.ReadLine(); stomb = str.Split(':'); str = stomb[0] + ", " + stomb[1] + " Ft, " + stomb[2]; listBox1.Items.Add(str); } reader.Close(); private void BetöltésGomb_Click(object sender, EventArgs e) { StreamReader reader = new StreamReader(new FileStream(@"c:\adat.txt", FileMode.Open)); string str; string[] stomb; while (!reader.EndOfStream) { str = reader.ReadLine(); stomb = str.Split(':'); str = stomb[0] + ", " + stomb[1] + " Ft, " + stomb[2]; listBox1.Items.Add(str); } reader.Close(); HozzáadásGomb.Enabled = true; //betöltve = true; }