Programozás s 2 Objektum Orientált Programozás C# nyelven utolsó változtatás s 2008.05.02.
.NET C# - Microsoft találm lmánya a.net platform számára. A C++ 'továbbfejleszt bbfejlesztése' se'.net hálózaton elosztott programok együttm ttműködése Előnyei: Nyelv független, f fordítás s közös k s közbensk zbenső nyelvre (Common( Intermediate Language), amit futás s közben k fordít t le a rendszer gépi g kódra k (Just( In Time compiler) potenciális egyszerűsítés: s: kódok k csoportjai csak egy-egy helyen vannak különböző típusú (Windows-os) os) eszközök k ugyanazzal a kóddal k támogathatt mogathatóakak Microsoft (és( s mások) m könnyebben k szabályozhatj lyozhatják k ki mikor mit futtathat Nyílt szabványokon (is) alapul: XML (Extensible( Markup Language ) és s SOAP (eredetileg 'Simple' Object Access Protocol' ') Hátrányai: Erőforr forrás s igénye a Common Language Runtime miatt nagy Windows specifikus (van linux-os open source próbálkoz lkozás s MONO, DotGNU ), de ezek nem teljesek (.NET 1.1 APIs teljes, 2.0 96%, 3 és s 3.5 -alfa) Egyes függvf ggvények a Base Class Library-ben ben Microsoft szabadalommal védettekv Már r most több, t mint 6000 függvf ggvénye van
Az első C# program Egy elso.cs nevű fájlba írjuk be a következk vetkezőket: ket: using System; // class Koszones // ki és s bevitelhez a namespace // minden vmilyen osztályban van // ide nem kéne k public, mert a Main()-t t nem hívhatjuk h meg // a static azt jelenti, hogy objektum létrehozl trehozás s nélkn lkül l is használhat lható args) // itt kezdődik dik a futás public static void Main(string[] args // args[0] az első paraméter, nem a program neve // kiiratás 0 az első behelyettesítend tendő paraméter Console.WriteLine("Szia 0!", args[0]); // itt az args Console.ReadLine(); // csak, hogy az ablak ne csukódj djon n be a Visual Studioból l futtatva. // itt az args[0]
C# alap típusokt Boolean csak true,, vagy false lehet. Egészek: sbyte 8-128 128 byte 8 0 256 short 16-32768 to 32767 ushort 16 0...65535 int 32-2147483648 to 2147483647 uint 32 0 4294967295 long 64-9223372036854775808 to 9223372036854775807 ulong 64 0 to 18446744073709551615 char 16 0..65535
C# alap típusokt valós s számok név stringek escape sorozatok: \' \" \\ \0 (nem \v hossz értékes jegyek tartomány float 32 7 1.5 x 10-45 to 3.4 x 10 38 double 64 15 5.0 x 10-324 to 1.7 x 10 308 decimal 128 28-29 29 1.0 x 10-28 to 7.9 x 10 28 nem azonos a null értékkel) \a \b \f \n \r \t
C# típusokt Minden típus t a System.Object osztályb lyból l van leszármaztatva, ezért vannak metódusai Pl. int a = 3; string s = a.tostring(); Tömbök k (péld ldák) int[] myints = 5, 10, 15 ; // integer tömb myints[2] = 9; ekvivalens deklaráci ció és s definíci ció: int[] myints = new int[] 5, 10, 15 ; string[] mystrings = new string[3]; assert(string[0]) == null) bool[][] mybools = new bool[2][]; //bool tömbt mböket tartalmazó tömb ('jagged' array) mybools[0] = new bool[2]; // az egyes tömbt mbök k dimenziója mybools[1] = new bool[1]; // különbk nbözhet double[,] mydoubles = new double[2, 2]; // két k t indexű tömb mydoubles[0,2] = 3.16; Felsorolási si típusok t (enum)
Feltételes teles és s ciklus utasítások sok Ami a C++ -ban is megvan, különbsk nbségekkel: 1. switch() argumentuma lehet enum, egész és string 2. Van foreach ciklus. pl: string[] gyumolcs = "Alma Alma", "Körte rte", "Szilva" Szilva"; foreach (string a in gyumolcs) Console.WriteLine("0 ", a);
Kategória elsődleges unáris operátorok C# operátorok (x) x.y f(x) a[x] x++ x new typeof sizeof checked unchecked + -! ~ ++x --x (T)x asszociativitás balra balra szorzás, s, stb * / % balra összeadás + - balra eltolás << >> balra reláci ciós < > <= >= balra egyenlőség ==!= jobbra logikai ÉS & balra logikai VAGY balra kizáró VAGY ^ balra feltételes teles ÉS && balra feltételes teles VAGY balra feltétel tel?... : jobbra értékadás = *= /= %= += -= <<= >>= &= ^= = jobbra
Nem static metódusok (függv ggvények) using System; class EgyModszeresOsztaly public static void Main() // static: nem kell objektumot létrehozni l hozzá (mint a C++-ban) string valasztas; EgyModszeresOsztaly om = new EgyModszeresOsztaly(); do valasztas = om.valaszt Valaszt();... while ( valasztas!= 'Q' && valasztas!= 'q'); string Valaszt() // nem static: objektum kell hozzá.. ezért van a new a Main-ben // nem public: kívülrk lről l nem érhető el string valasztas; valasztas = Console.ReadLine(); return valasztas;
Osztályok Class Minden elem (objektum, változv ltozó,, konstans, függvf ggvény, stb) valamilyen osztályban van A hozzáférési jogokat minden elemhez meg kell adni. Ezek lehetnek: public protected internal protected internal private bárki hozzáférhet csak a class és s leszármaztatottjai férhetnek f hozzá csak ebből a gyűjtem jteményből l (azaz az együtt fordított fájlokból ún. assembly-ből) l) hozzáférhet rhető,, de itt mindenki számára (azaz itt olyan, mintha public lenne) ebben az assembly-ben ben public, más m s assemblyk-ben ben protected csak maga az osztály férhet f hozzá az osztály elemei lehetnek static-ok. Ezek használatához nem kell objektumot létrehozni.
Osztályok 2 constructor public, private, static nincs paramétere, nem hívhath vható explicit módon m (new-val) destructor nincs paramétere, nem hívhath vható meg, nem lehet public, stb konstans elemek definíci ció szerint static-ek, de nem szabad a static kulcsszk lcsszót t eléjük írni: Pl.: public const int A=175; public const int B = A + 6; A static elemek is megváltoztathat ltoztathatóak ak de ez letiltható: public static readonly int piros; A readonly elemek értékét t csak deklaráci cióban, illetve constructorban lehet megadni:
Osztályok 3. class Color internal ushort redpart; internal ushort bluepart; internal ushort greenpart; public Color(ushort red, ushort blue, ushort green) redpart = red; bluepart = blue; greenpart = green; public static readonly Color Red = new Color(0xFF, 0, 0); public static readonly Color Blue = new Color(0, 0xFF, 0); public static readonly Color Green = new Color(0, 0, 0xFF); public static readonly Color White = new Color(0xFF, 0xFF, 0xFF);
Függvényparaméterek Érték k (value) paraméterek int F(int i) return 2 * i; -> int k = F(12); int j = F(k); ref paraméterek referencia int F( ref int i) return 2 * i; -> int i =4; int k = F(i); // i == 8 out paraméterek csak output a belső paraméter értékét t adja át az out paraméterben class C; int F( out C c) C cc; c = cc; return 1; params paraméterek változó hosszúságú int F(params int [] Param1) foreach(int P in Param1) return v; Túlterhelés: A függvf ggvények argumentumainak száma, típusa, t módosm dosítói i különbk nböznek. Pl.
Túlterhelés - Overloading using System; class Test static void F() Console.WriteLine("F()"); ()"); static void F(object o) Console.WriteLine("F(object)"); static void F(int value) Console.WriteLine("F(int)"); static void F(ref int value) Console.WriteLine("F(ref int)"); static void F(int a, int b) Console.WriteLine("F(int, int)"); static void F(int[] values) Console.WriteLine("F(int[])"); static void Main() F(); F(1); int i = 10; F(ref i); F((object)1); F(1, 2); F(new int[] 1, 2, 3);
Property-k úgy használhat lható mintha változó lenne, de valójában függvf ggvényhívás: public class Gomb private string szoveg; public string Szoveg get return szoveg; ; // olvasás: s: amikor a Szöveg egy értékadás s jobb oldalán n szerepel set caption = value; Repaint(); // írás: ha a Szöveg egy értékadás bal oldal // value az értékadás s jobb oldaláról l származ rmazó érték k neve a set -en belül // a compiler ezt a nevet várjav void UjraRajzol() s bal oldalán n szerepel Gomb b = new Gomb(); b.szoveg = "Kilépés"; // ez egyúttal újra is rajzolja a szöveget a gombra
Indexer-ek ek valamely osztály úgy kezelhető,, mintha tömb t lenne.. ráadr adásul nem is csak int argumentummal: class AsszociativIntTomb private int [] _arr; pubkic AsszociativIntTomb(int int size) _arr = new int[size size]; int this[string s] // ez az indexer nincs saját t neve, csak a this használhat lható // ugyanúgy túlterhelhett lterhelhető,, mint bármely b más m s függvf ggvény get int i = int.parse(s); // a string-ből l integer-t t csinál return _arr[i]; set int i = int.parse(s); _arr[i] = value; Használata: AsszociativIntTomb tomb = new AsszociativIntTomb(3); tomb["1"] = 123;
Események Pl. egy gombnyomás: public delegate void EsemenyKezelo(object sender, System.EventArgs e); // a delegate egy olyan típust t jelöl, l, ami egy függvf ggvényt tartalmaz (C++ : egy függvf ggvényre mutató pointer) public class Gomb public event EsemenyKezelo Click; // a fent definiált delegate típust pusú változó public void Reset() Click = null; Click használata: kizárólag += vagy -= = bal oldalán n szerepelhet. += hozzáad egy esemény kezelőt, -= elvesz egyet. Pl. : void Gomb_Kattintas(object sender, System.EventArgs e) // csinál l valamit Gomb gomb1 = new Gomb(); gomb1.click +=.new EsemenyKezelo(Gomb_Kattintas); Lehetséges saját t esemény hozzáad adó,, ill. eltávol volító függvényt is defininiálni.
Leszármaztat rmaztatás using System; abstract class A // absztrakt: nem lehet objektumot létrehozni l belőle le public abstract void F(); // nincs megadva mit csinál class B : A public override void F() // átdefiniálva Console.WriteLine(" ("B.F"); public virtual void G() // virtual átdefiniálható a leszármaztatott osztályban Console.WriteLine(" ("B.G"); class C: B public override void G() // az átdefiniáláshoz kell az override base.f.f(); // a szülő osztály módszerem Console.WriteLine(" ("C.G");");
struct Hasonló az osztályhoz, vagy az interface- ekhez de: nem lehet leszármaztatni belőle le érték-ként adódik dik át t (osztály referenciaként) nt) stack-en tároljat időnk nként nt sok allokáci ciót t takaríthatunk thatunk meg vele
interface-ek ek módszereket, property-ket, indexer-eket eket és s event-eket eket tartalmazhat. Pl. interface IPeldaI string this[int index] get; set; event EventHandler E; void F(int v); string P get; set; public delegate void EventHandler(object sender, EventArgs e); Az interface-ben a mezők k nincsenek megvalósítva
interface-k k 2. Interface-ekkel ekkel oldható meg a többszt bbszörös s leszármaztat rmaztatás. Egy osztály csak 1 osztályb lyból, l, de bármennyi b interface-ből származtathat rmaztatható le: class A virtual public void F(inti) ) interface IPelda1 void P1(int i); interface IPelda2 void P2(string s); class B : A, IPelda1, IPelda2 public override void F() // A-bólA public void P1(int i) // implicit interface elem IPelda1-ból void IPelda2.P2(string s; ) // explicit interface elem IPelda1-ból Hívásaik: class Test static void Main() B b = new B(); b.f(); b. P1(3); b.p2("alma") // error: no such method. az explicit elemet nem lehet meghívni így! IPelda2 ipelda2 = b; // a leszármaztat rmaztatás s miatt b egyúttal IPelda2 is ipelda2.p2("alma"); // ez már m r jój
C# - C++ összehasonlítás Mindkettőben a kis és s nagybetű különböző.. de C#- ban Nincsenek globális lis változv ltozók, vagy függvf ggvények, minden vmilyen osztályon belül l van Egy blokk lokális lis változv ltozói i nem fedhetik el a blokkon kívülieket A bool típus nem konvertálhat lható más s típusst pussá Mutatók által mutatott memóri riát t csak unsafe jelölésű szakaszokban lehet használni, ott is csak ha megfelelő engedély van rá. r. (Mutatót t használni máshol m is lehet, de az általa mutatott memóri riát/változót t nem)
C# - összehasonlítása a a C++ -al A 0 indexű parancssori paraméter a C++ ban az 1 indexű lenne (a program neve nincs a paraméterek között) k A memóri riában automatikus szemétösszegy sszegyűjtés s van. A csak absztrakt függvényeket tartalmazó absztrakt osztály neve nem class, hanem interface Nincs többszt bbszörös s leszármaztat rmaztatás class-szal szal,, de van interface-szel struct: mint a class, de c#-ban nem lehet sem őt t magát, sem belőle le leszármaztatni. (de a struct-ok is a System.Object leszármazottai rmazottai) ) Nem lehet paraméter nélkn lküli li constructor-a. Ha nem adunk meg constructort a változók k default értéket (pl. 0, null) kapnak. Típusok közötti k konverzió általában csak explicit lehet. (kivétel pl. leszármaztat rmaztatás, integer) Felsorolásos sos típusoknak t saját t namespace-e e van properties A típusokhozt meta-infom infomációk tartoznak
C# Részleges osztály definíci ciók több fájlra f eloszthatóak ak (így pl. csak azt látjuk, l ami abban a fájlban f érdekes) PL. legyen az Univerzum osztály két k t fájlban f (uni1.cs( és uni2.cs) ) definiálva.
partial class példap Az univ1.cs fájlbanf public partial class Univerzum public Univerzum() _azon_ = 0; Az univ2.cs fájlbanf public partial class Univerzum private int _azon;
C# Generics futás s közben k az aktuális típus t felhasználásával jönnek j létre l (C++ template-ek ek fordítási időben)