Krizsán Zoltán
Szabályok I Kis és NAGY betű érzékeny Szigorúan osztályok halmaza, azaz a kódok csak osztályon belül lehetnek. Az osztályok névterekbe vannak szervezve. Using a file elején. A rendszer minden esetben a Main fv.-t keresi, ha több van, akkor meg kell jelölni egy osztályt
Szabályok II Minden utasítást pontos vessző zár. Utasítás zárójel a: „ { ”, „ } ”. 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 (kis várakozás után fut, hogy miért arról később lesz szó)
Kifejezések 1 vagy több operandus + 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
Érték típusok I Közel 300 beépített érték típus. Minden beépített érték típus struktúra. Ez struktúra. Automatikusan létrejön. Értékadás adatmásolás. Nem kell new operátor (de lehet) Létrehozáskor 0-ra áll be
Null-ozható értéktípus Nullable Érték típusú változóknak nem lehet étéke null, csak ha T? a definíció. Ahol T bátmilyen érték típus lehet. Pl.: int? numericValue = null; Értéke a normál típus + null lehet 2.0-tól Nullable kulcsszó a nem beállított értékre. System.Nullable egy példánya a T? Bármilyen értéktípus módosítható a ? Jellel ?? Operátor az ellenőrzésre, beállításra int? myData = dr.GetIntFromDatabase() ?? 100;
Érték típus II egyszerű vagy primitív stack-en tárolódik alapértelmezett a következő esetekben: lokális változó Fv. paraméter Fv. visszatérési érték Ha new-val hozzuk létre, akkor van alapértelmezett érték!
Érték típus III Minden érték típushoz képződik egy osztály a dobozolás alkalmával Ugyanazokkal az adatokkal, ugyanazokkal a viselkedésekkel. Szükség esetén képződik objektum ebből az osztályból azonos állapottal
Túlcsordulás Ha a konverzió adatvesztéssel jár -> nincs hibajelzés (bekapcsolható) Checked, unchecked scope try { checked { byte sum = (byte)Add(b1, b2); Console.WriteLine("sum = {0}", sum); } catch (OverflowException ex) { Console.WriteLine(ex.Message); }
Egész típusok NameCTS TypeDescriptionRange (min:max) sbyteSystem.SByte8-bit signed integer-128:127 (-2 7 :2 7 -1) shortSystem.Int1616-bit signed integer-32,768:32,767 (-2 15 : ) intSystem.Int3232-bit signed integer-2,147,483,648:2,147,483,647 (-2 31 : ) longtSystem.Int6464-bit signed integer-9,223,372,036,854,775,808: 9,223,372,036,854,775,807 (-2 63 : ) byteSystem.Byte8-bit unsigned integer0:255 (0:2 8 -1) ushortSystem.UInt1616-bit unsigned integer0:65,535 (0: ) uintSystem.UInt3232-bit unsigned integer0:4,294,967,295 (0: ) ulongSystem.UInt6464-bit unsigned integer0:18,446,744,073,709,551,615 (0: )
Nem egész típusú szám NameCTS TypeDescriptionSignificant Figures Range (approximate) floatSystem.Single32-bit single- precision floating point 7±1.5 × 10 −45 to ±3.4 × doubleSystem.Double64-bit double- precision floating point 15/16±5.0 × 10 −324 to ±1.7 × NameCTS TypeDescriptionSignificant Figures Range (approximate) decimalSystem.Decimal128-bit high precision decimal notation 28±1.0 × 10 −28 to ±7.9 × 10 28
Felhasználói érték típusok felsorolt - enum Struktúra (van némi hasonlóság az osztályhoz, de lényegesen más) C# struct
Felsorolt típus Segítségével neveket rendelhetünk a benne foglalt érték típusoknak. Befoglalt elemek típusa előjeles vagy nem előjeles egész lehet, vagy literál. Használjuk, mert névvel ellátott adat és nincs cast. Közvetlen ős: System.Enum Nem lehetnek metódus tagjai. Nem implementálhat interfészeket. Nem lehet tulajdonság, vagy esemény tagja. Nem lehet genetikus (hiszen már van típusa a beágyazottaknak)
Felsorolt – bit field [Flags] public enum Seasons { None = 0, Summer = 1, Autumn = 2, Winter = 4, Spring = 8, All = Summer | Autumn | Winter | Spring }
Felsorolt Alapértelmezetten int az alaptípusa, de meg lehet változtatni. enum byteType : byte { elso= 1, masodik= 3, } Hivatkozás: byteType.elso
Referencia típusok Közel 2500 beépített referencia típus. System.Object, System.String, System.Text.StringBuilder, System.Array, …. System.Exception Referencia „pointer” a stack-en, tényleges adat a heap- en Az adat rész akkor jön létre, ha a programozó létrehozza. Felszabadítás a szemétgyűjtő, „garbage collection” feladata. Értékadás referencia másolás (ugyanarra mutat)
String, StringBuilder string, String: – UTF-16 karakterekben tárol – nem módosítható, változás eredménye új példány. – Concat, Join, System.String.Format("{0} times {1} = {2}", i, j, (i * j)); – +, =, !=, == szövegre értelmezetten. (tartalmat, nem referenciát hasonlít – string newPath Files\Microsoft Visual Studio 9.0"; StringBuilder: – Módosítható szöveg – Konstruktornak megadható a kívánt méret, de igény szerint növekszik
String II Használjuk a ””’ értéket vagy a String.Empty default értéknek. Statikus IsNullOrEmpty(String) Format fv. Paraméterezése writeline-al azonos. Részszting: s3.Substring(7, 2) csere: s3.Replace(”mit”, ”mire”) Karakter keresés: s3.IndexOf("C"); Betűk elérése: s3[5] // 6.betű
String III string[] values = { "1,304.16", "$1,456.78", "1,094", "152", "123,45 €", "1 304,16", "Ae9f" }; try { culture = CultureInfo.CreateSpecificCulture("en-US"); number = Double.Parse(value, culture); Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number); } catch (FormatException) { culture = CultureInfo.CreateSpecificCulture("fr-FR"); try { number = Double.Parse(value, culture); Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number); }
Érték kontra referencia Érték: Minden típus közvetlenül a System.ValueType vagy System.Enum (System.ValueType az őse) osztályból származik. Lepecsételt (sealed): nem lehetnek más elemeknek ősei Referencia: a szemétgyűjtő által vezérelt heap-ban tárolódik (a cím a stack-ben) Erős típus referencia: frissül, ha a szemétgyűjtő mozgatja az elemet
Escape szekvencia A szövegekben a ‘\’ jel után álló karakterek máshogy viselkednek. – ‘\' – ”\" – \\\ – Csengő\a – Törlés\b – Form feed\f – Új sor\n – Kocsi vissza\r – antiescape
Változó deklaráció Típus azonosító; Utasítás lett, azaz bárhova elhelyezhető, ahol utasítás állhat. Váltózó lehet: – Adattag – Lokális változó Lokális változó élettartama a hatáskör vége „}” Lokális változónak explicit be kell állítani a kezdőértékét mielőtt használnánk! (fordítási hiba, ha nincs) Ha érték típust new-van hoztuk létre, akkor már van
Változó II Lokális változót lehet egy beágyazott blokkban is definiálni, de: public static int Main() { int j = 20; for (int i = 0; i < 10; i++) { int j = 30; // Hiba, ilyen lokális változó már van! Console.WriteLine(j + i); } return 0; }
Típus Információ a: Szükséges memória használathoz Lehetséges érték, túlcsordulás, maximum- minimum érték Elemeiről Ős típusról A tárolás helyéről (stack | heap) Milyen operációk engedélyezettek. Metadatákban tárolja a szerelvényben, amit a CLR használ a helyes használathoz (pl. kompatibilitás)
Implicit típus I Var kulcsszó a típus helyet A fordító dönt. Egyszer hozzárendeli a típust, ami később nem változhat! Az inicializáló kifejezés típusa dönt ( = kif ) A típus lehet: Beépített, Anonymous, Felhasználói, FCL
Implicit típus II Hol használható: Lokális változó (fv. Törzsben), For ciklus inicializáló kifejezésben for(var x = 1; x < 10; x++) Foreach ciklus inicializáló kifejezésben foreach(var item in list) Using utasításban using (var file = new StreamReader("C:\\myfile.txt")) {...} Megj: adattag nem lehet, és inicializálni kell azonnal
Implicit típus III var i = 5; // s is compiled as a string var s = "Hello"; // a is compiled as int[] var a = new[] { 0, 1, 2 }; // anon is compiled as an anonymous type var anon = new { Name = "Terry", Age = 34 }; // list is compiled as List var list = new List ();
Anonymous típus Név nélküli = generál neki a fordító csak mi nem látjuk. var v = new { Amount = 108, Message = "Hello" }; New operátor kell, és {} Egy osztály készül, aminek 1 vagy több csak olvasható tulajdonsága van. Nem lehet más típusú eleme. Csak object-re lehet konvertálni. Csak implicit típusú változóknál használhatjuk (var). Referencia típus, közvetlen őse az object. Két anonymous típus akkor egyenlő ha azonos sorrendben, azonos típusú tulajdonságokat tartalmaz (pedig a név különböző)
Típus definíció 1. [Attríbútumok] - metainformáció 2. Elérhetőség – public | assembly 3. Ős típus 4. Implementált interfészek 5. Elemek definíciói
Konstans Inicializálni kell definíció során. Később nem lehet az értékét változtatni. Az értéke fordítási időben kiértékelhető kifejezés kell legyen (operandus: literál, vagy másik konstans) Automatikusan statikus lesz, és nem is lehet ezt már megadni
Tömbök I Alaptípus[] azonosító; // deklaráció Aztán később: azonosító = new Alaptípus[méret]; //létrehozás Első elem indexe 0, utolsó n-1 Pl.: int[] t = new int[100]; ekkor első elem:t[0], utolsó elem: t[99] Ha 1 lépésben szeretnénk deklarálni és lefoglalni, sőt feltölteni elemekkel, akkor: int[] t = new int[2]{12,23}; vagy int[] i = {1,2};
Tömbök II System.Array osztály egy példánya Van default értéke az elemeinek (0, null). Foreach használható. Több dimenziós tömb: int[,] squareArray = new int[2,3]; int[,] squareArray = {{1, 2, 3}, {4, 5, 6}}; Jagged (nem egyenméretű) int[][] jag = new int[2][]; jag[0] = new int [4]; jag[1] = new int [6];
Tömbök III Length : csak olvasható tulajdonság a tömb mérete Rank: dimenzió Több interfészt is implementál, ezekről később. NE HASZNÁLJUK ÍGY: public static readonly char[] InvalidPathChars = {'\"', ' ','|'}'
Helló világ using System; namespace HelloWorld { class Hello { static void Main() { System.Console.WriteLine("Hello World!"); }
Main fv. class TestClass { static void Main(string[] args){ System.Console.WriteLine(args.Length); } Main visszatérési értéke vagy void vagy int. Paramétert vagy definiálunk, vagy nem. Ha igen akkor a parancssori argumentumok vannak benne
Utasítások Utasítás lehet: Lokális változó definíció Konstans definíció Fv. Hívás Objektum létrehozás Változó vagy tulajdonság vagy adattag értékadása. Szervezhetjük ciklusba Definiálhatunk elágazást
Ciklusok do { … } while (hátul tesztel, fut amíg igaz) for (int i = 1; i <= 5; i++) inicializál feltétel, fut amíg igaz léptető rész foreach tömbök kollekciók végigjárása, minden elem értékét felveszi a ciklusváltozó int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 }; foreach (int i in fibarray) { System.Console.WriteLine(i); } a példában szereplő „i” konstans! In foreach „()”-ben használjuk foglalt szó while (elöl tesztel)
Feltételes utasítások I If – feltétele csak logikai kifejezés lehet, else ág elhagyható Nincs then kulcsszó if (a == 5) System.Console.WriteLine("A is 5"); else System.Console.WriteLine("A is not 5"); Használható helyette a ? : operátor: int i = (myBoolean) ? 1 : 0 ;
Feltételes utasítás II Pl.: int caseSwitch = 1; switch (caseSwitch) { case 1: Console.WriteLine("Case 1"); break; case 2: Console.WriteLine("Case 2"); break; default: Console.WriteLine("Default");break; } Nem lehet 2 ága melynek ugyanaz az értéke Kell a break, mert a feltétel csak kijelöli a beugrás helyét, és végigfutna!
Switch II for (int i = 1; i < 5; i++) { switch (i) { case 1: Console.WriteLine("In case 1"); goto case 3; case 2: Console.WriteLine("In case 2"); goto case 1; case 3: Console.WriteLine("In case 3"); goto default; default: Console.WriteLine("In default"); break; }
I / O I. Kiírás: – Console.Write() – Kiírja a kimenetre – Console.WriteLine() – kiír a kimenetre, de egy újsort is ír a végére Beolvasás: – Console.ReadLine() – Beolvas egy sort Használat: – Console.WriteLine(”mit írjon ki {0} ”, parameter1, parameter2, … ); A szöveget írja ki. A paramétereket a {paraméter sorszáma} –val illeszti be (0 kezdőindexű) paramétereket használja fel, bármennyi lehet. int i = 10; int j = 20; Console.WriteLine("{0} plus {1} equals {2}", i, j, i + j);
Formátum sztringek StringDescription CLocal currency format. DDecimal format. Converts an integer to base 10, and pads with leading zeros if a precision specifier is given. EScientific (exponential) format. The precision specifier sets the number of decimal places (6 by default). The case of the format string (e or E) determines the case of the exponential symbol. FFixed-point format; the precision specifier controls the number of decimal places. Zero is acceptable. GGeneral format. Uses E or F formatting, depending on which is more compact. NNumber format. Formats the number with commas as thousands separators, for example 32, PPercent format. XHexadecimal format. The precision specifier can be used to pad with leading zeros
I / O II. A következő példa a Windows beállításokat alapul véve írja ki pénzügyi formátumban: decimal i = m; decimal j = 73.7m; Console.WriteLine(" {0,9:C2}\n+{1,9:C2}\n \n {2,9:C2}", i, j, i + j); Ha a szélességet is megadjuk, akkor: {index,szélesség} formában kell
Névtér (namespace) A saját elemeket névtérbe szervezhetjük, logikai kapcsolat alapján. Elszigeteli az elemeket. Így egy forrásfájlban akár több azonos nevű osztály lehet Pl.: Math névtér Szintaktika: namespace név{ elemek definíciói } A névterek egymásba ágyazhatóak. Ha 1 névteret gyakran használunk, és nem szeretnénk minden alkalommal kiírni, használjuk a using utasítást a fájl elején!
Megjegyzések A fordító meg se kapja ezeket a sorokat /* Több soros */ i = 23; // egy soros a sor végéig tart De bizonyos megjegyzésekből dokumentáció generáltatható
Dokumentációs kommentek I TagDescription Marks up text within a line as code, for example: int i = 1 0; Marks multiple lines as code. Marks up a code example. Documents an exception class. (Syntax is verified by the compiler.) Includes comments from another documentation file. (Syntax is verified by the compiler.) Inserts a list into the documentation. Marks up a method parameter. (Syntax is verified by the compiler.) Indicates that a word is a method parameter. (Syntax is verified by the compiler.) Documents access to a member. (Syntax is verified by the compiler.) Adds a description for a member
Dokumentációs kommentek II TagDescription Documents the return value for a method. Provides a cross-reference to another parameter. (Syntax is verified by the compiler.) Provides a “see also” section in a description. (Syntax is verified by the compiler.) Provides a short summary of a type or member. Describes a property.
Dokumentáció készítés Példa: namespace Sajat.Basics { /// /// Sajat.Basics.Csak class. /// Provides a method to add two integers. /// public class Math { /// /// The Add method allows us to add two integers. /// /// Result of the addition (int) /// First number to add /// Second number to add public int Add(int x, int y) { return x + y; } } Készítés a ”csc /doc:doksi.xml Csak.cs” paranccsal