1.oldal C-Sharp nyelv alapjai 1. Egyszerű példák Az első alkalmazás a Hello World parancssorból: (cmd) notepad hw.cs A Visual Studio Command Promp-ot nyitjuk meg, mert ekkor benn van a parancssorban a C# fordító (Csc.exe C# -hoz ingyenes fordító a.net-el együtt) using System; // képernyőre kiírás is a Systemben van! És még sok fontos dolog... namespace First //névtér public class FirstClass public static void Main(string[] args) //Nem kell argumentum szám, mert lekérdezhető a tömbből Console.WriteLine("Hello World!"); //kiír Fordítás: csc hw.cs Futtatás: hw.exe Több nyelv együttműködése példa a Visual Studio 2005-el szerkesztve: Példa együttműködésre: C# és C++ Consol App. C# : using System;
2.oldal using System.Collections.Generic; using System.Text; //using CppClasses; namespace MainApp class Program static void Main(string[] args) CppClasses.CppClass cppclass = new CppClasses.CppClass(); cppclass.cppkiir(); Add New project (C++): // CppClasses.h #pragma once using namespace System; namespace CppClasses public ref class CppClass public: void CppKiir() Console::WriteLine("Hello from cpp"); ; Add reference a C# projektben a C++ projektre Ctrl+Shift+B = fordítás (vmi fv) using CppClasses; és a fv-t használhatjuk a programban, vagy a teljes nevével hivatkozva használjuk a
3.oldal Típusok Minden típus a System.Object-ből származik Alaptípusok:.NET Type C# Type Visual Basic Type Description System.Byte byte Byte An unsigned one-byte value, 0 through 255. System.SByte sbyte A signed one-byte value, -128 through 127. System.Int16 short Short A signed two-byte value, -32768 through 32767. System.UInt16 ushort An unsigned two-byte value, 0 through 65535. System.Int32 int Integer A signed 4-byte value, -2,147,483,648 through 2,147,483,647. System.UInt32 uint An unsigned 4-byte value, 0 through 4,294,967,295. System.Int64 long Long A signed 64-bit integer value -9,223,372,036,854,775,808 through 9,223,372,036,854,775,807. System.UInt64 ulong An unsigned 64-bit integer, value 0 through 18,446,744,073,709,551,615. System.Single float Single A 32-bit floating-point number that can hold values -3.402823e38 to 3.402823e38. Precision is 7 digits. System.Double double Double An 8-byte floating-point number with a range of -1.79769313486232e308 to 1.79769313486232e308, and 15 or 16 digits of precision. system.decimal Fixpoint, 128-bit (16-byte) from -79,228,162,514,264,337,593,543,950,335 to negative 79,228,162,514,264,337,593,543,950,335, Diszkrét és valós számtípusok Az int-nek megfelel a System.Int32, (32bit-en tárolja) és hasonlóan Int8 Int16 32, UInt... short, long, float, double, char, string, bool hasonló elnevezés C++-hoz ( eredeti C ++ : int illetve longnál a tárolási hossz nincs definiálva csak a < reláció, itt viszont: ).NET szabványa szerint minden változónál a fix hosszúság adott! Karakter és string A karakter az érték típusú (unsigned 16-bit) String = karakter tömb (16 bites Unicode ld. később) viszont már referencia típus. De a string immutable típusnak van definiálva. Ez azt jelenti, hogy ha megváltoztatom (pl: s = s.replace ("régi szövegrész", "új szöveg "); ) akkor az egész lemásolódik egy új memóriaterületre úgy hogy ott már módosítva lesz (kicseréli a szövegrészt) és az eredeti változónk egyszerűen átmutat az új helyre (referencia). Ref és value type-ok azaz referencia és érték típus (ld. GC "kicsi" ref típusokat tömöríti, nagyokat hagyja, érték típusúak stacken képződnek) Értékadás Érték típusnál másolat képződik Referencia típusnál ugyanarra memóriára mutatnak (lehet null érték)
4.oldal ( C# 2-ben nullable = mégis kaphatnak null-at az érték típusúak pl: int? i ) Class és struct közötti különbség class ref. típusú struct érték típusú Példa. Mit ír ki: class RefTypeEx public RefTypeEx() ; public int i; struct ValueTypeEx public int i; ; private static void TipusExample() Console.WriteLine("referencia típus."); RefTypeEx r = new RefTypeEx(); r.i = 1; RefTypeEx rr = r; rr.i = 2; Console.WriteLine("eredeti: " + r.i); Console.WriteLine("értékadás bal oldala: " + rr.i); Console.WriteLine(); Console.WriteLine("érték típus."); ValueTypeEx v = new ValueTypeEx(); v.i = 1; ValueTypeEx vv = v; vv.i = 2; Console.WriteLine("eredeti: " + v.i); Console.WriteLine("értékadás bal oldala: " + vv.i); Tömbök //Refactor menü (ld később) int [ ] intarray = new int[32] for ciklus (ld. c++) ÚJ: intarray[32]=0 //védett biztonságosabb, mert nem engedi meg a túl indexelést (Managed) Példa:
5.oldal private static void Arrays() int[] intarray = new int[32]; for (int i = 0; i < intarray.length; i++) intarray[i] = i; for (int i = 0; i < intarray.length; i++) Console.Write(intArray[i].ToString() + ", "); //Elszáll: //intarray[32] = 0; Konverziók Kiiratásnál nincs explicit konverzió alapban, de.tostring() metódus minden változónak van! (System.Object-től öröklik) Equals metódus szintén Object-ból származik ahol referencia szerint hasonít össze 2 elemet pl: String öröklődik az Obj.ból és az Equals metódus felüldefiniálható, hogy betűket hasonlítsa GetHashCode = kulcsra hivatkozott hasonlítás (object-ből származik,felüldefiniálható) GetTye = futás idejű típust adja vissza (Type -ban) (object-ből származik) String - int konverzió: String sval= 123 ; int parsed=int.parse(sval); Console.Writeline(parsed); //int.tryparse() //Beolvasott String szám e? Nem dob Exceptiont, ha 100000 számot (és néha mást) kell átkonvertálni Példa: private static void ConvertF() string str = "ez egy string"; Console.WriteLine(); Console.WriteLine("konverziok."); int j = 1; string strint = j.tostring(); Console.WriteLine(strInt); object o; Console.WriteLine(j.GetType()); string sval = "1243"; // statikus metódus hívás int parsed = int.parse(sval); // int.tryparse( Console.WriteLine(parsed); // Convert.ToInt16( Másik lehetőség: Convert.ToInt16()
6.oldal Enum - Felsorolási típus Automatikusan 0-tól egyesével sorszámozódik, de adhatunk direktbe más értéket neki Enum FelsorTip F1, F2, F3=42; FelsorTip f = FelsorTip.F1; Példa: private static void FelsorTipusok() FelsorTipus f = FelsorTipus.F1; Console.WriteLine(f); Console.WriteLine((int)f); FelsorTipus f3 = FelsorTipus.F3; Console.WriteLine((int)f3); Alapvető programkonstrukciók If (felt ) [ut/blokk] else [ut/blokk] feltételek: (ld C++) &&!= == switch, case switch (kif) case "a": Console.WriteLine("aa"); break; //"a" lehet String a case feltétele, a break nem hagyható el (csak ha nincs kód) for szokásos foreach ha enum interfacet implementálják foreach(int f in intarray) Console.Write(f); //enum interfacet implementálják. Bejár egy Collectiont /tömböt/ intarray.length a tömb elemszámát adja vissza continue; break; használható (ld. C++) Példa: private static void ProgKonst() int i = 1; RefTypeEx r = new RefTypeEx(); if (i == 1 && r!= null) else string s = "s"; switch (s)
7.oldal case "a": Console.WriteLine("aa"); break; case "b": case "c": Console.WriteLine("bb"); break; default: Console.WriteLine("def"); break; int[] intarray = new int[32]; for (int j = 0; j < intarray.length; j++) intarray[j] = j; //continue; //break; foreach (int f in intarray) Console.Write(f); Osztályok függvények, metódusok, member változók, static Pl: class ExampleClass public ExampleClass(int i) //konstruktor this.i = i; public int Lekerdezo() return i; public void SetValue(int j) i = j; q = j; public static void StaticFunc(int qq) q = qq;
8.oldal // nem adhat értéket nem static memberváltozónak private int i; private static int q = 1; Main-be: ExClass excl=new ExClass(2); Új sor karakter: "\n" (ld. C++) Static class Csak statikus változók. Statikus fv. csak statikus változókkal. Statc constructor első hivatkozáskor fut le. Példányosítani nem lehet, 1 van belőle. Paraméterátadási módok (alapért, out, ref) Pl. érték szerint átadási mód: ref-t adjuk át mint értéket, csak obj. belül tudjuk megváltoztatni. kívülről nem tükröződik a referencia változtatása ref szerint átadási mód: ref értkre alkalmazható másolat készül róla. Kívülről tükröződik az érték típusokváltoztatása csak kifele menő: nem érdekel mi megy be felülírja public void RRRValue(RefTypeEx r) //kinn is latszani fog r.i = 1; //nem fogja a kinti valtozok felulvagni r = new RefTypeEx(); public void VVVValue(ValueTypeEx v) //kinn nem fog laszodni a kov ertekadas eredmenye v.i = 1; //nem fogja a kinti valtozok felulvagni v = new ValueTypeEx(); public void VVVRef(ref ValueTypeEx v) //kinn is latszani fog v.i = 1; //felulvagja a kinti valtozot v = new ValueTypeEx();
9.oldal public void RRROut(out RefTypeEx r) //kinn is latszani fog r = new RefTypeEx(); //kinn is latszani fog r.i = 1; operátor overloading láthatóság (ld C++) Láthatóság namespace Classes class MyClass ; MyClass-nál: private alapban, ilyenkor senki sem látja a namespacen kívűl (akkor sem ha uaz a namespace, vagy file) public esetén mindenki látja internal esetén tetszőleges namespace-ben lát az adott modulon(fájlon) belül Pl: //csak abból a modulból látható ahol definiálva van internal class X // (sealed kulcsszó) nem lehet belőle származtatni sealed class Sealed // nem lehet példányt létrehozni belőle, //csak abból a leszármazottból (ami nem abstrakt) és minden metódusa implementálva van abstract class Abs abstract public void AbsFunc(); public void ImplementáltMetódus()
10.oldal C-Sharp nyelv alapjai 1.... 1 Egyszerű példák... 1 Típusok... 3 Alapvető programkonstrukciók... 6 Osztályok... 7