Szoftverfejlesztés .NET platformon - Jegyzet 1. fejezet

A VIK Wikiből

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


<noautolink> 70-536 .NET Framework 2.0 Application Development Foundation

%TOC{depth="3"}%

Típusok

Érték típusok

Érték szerint adódnak át. Metódushíváskor az érték szerinti argumentumokból másolat keletkezik, a metódus futása során az eredeti érték nem változik.

  • beépített egyszerű érték típus: érték szerint kerülnek átadásra
    • fixpontos (egész), lebegőpontos, =Char=, =Boolean=, =IntPtr=, =DateTime=, ...
    • deklarálás = létrehozás, nem kell =new=
  • felsorolás = egymáshoz kapcsolódó szimbólumok halmaza
    • növeli a kód olvashatóságát
    • a szimbólumok belül
      int
      -ként vannak ábrázolva
    • deklaráció: =enum Kartyaszin : int { Treff, Karo, Kor, Pikk }=
  • felhasználó által definiált érték típus: =struct=, pl. =System.Drawing.Point=
    • logikailag egy érték
    • legfeljebb 16 byte esetén érdemes használni

(a beépített struktúrák mind legfeljebb 16 byte-osak)

    • tipikusan read-only
    • akkor használják, ha nincs szükség érték-referencia típuskonverzióra
    • deklaráció: =struct Point { int x,y; }=
    • rendelkezhet konstruktorral és metódusokkal is
  • =Nullable<típusnév> változónév=:

lehetővé teszi, hogy egy érték típus

null

-t vegyen föl

    • C#-ban rövid jelölés: =típusnév? változónév=
    • =HasValue=: van-e értéke
    • =Value=: az érték

Referencia típusok

Pointer egy heap-ben tárolt adatra. A

System.Object

-ből származik. Felvehet

null

-t is. Metóduson belül megváltoztatható, a változást a hívó is látja. Az általa lefoglalt memória felszabadításáról a garbage collector gondoskodik.

Beépített referencia típusok

  • =Object=
  • =String=, =StringBuilder=. A =String= immutable (megváltoztathatalan).

Ha meg akarjuk változtatni, új példány jön létre.

Helyette

StringBuilder

-t érdemes használni.

  • =Array=: tömbök közös ősosztálya. Alapból támogat néhány műveletet, pl. =Array.Sort()=
  • =Exception=: hibás működés kezelése, számítani kell rá. Hibakezelés: =try - catch - finally=. A
    finally
    -ben nem érhetők el a
    try
    -ban deklarált változók
  • =IO.Stream=: absztrakt stream osztály.

Leszármazottjai: =FileStream=, =MemoryStream=, =StreamReader=, =StreamWriter=.

Példa szöveges file olvasására hibakezeléssel:

try {
	 TextReader tr = new StreamReader(locationTextBox.Text);
	 try {
		  displayTextBox.Text = tr.ReadToEnd();
	 } catch (Exception ex) {
		  MessageBox.Show(ex.Message);
	 } finally {
		  tr.Close();
	 }
} catch (Exception ex) {
	 MessageBox.Show(ex.Message);
}

Öröklés

Öröklés = inheritance. Meglévő osztályt egészít ki újabb funkcionalitással.

  • Egy ősosztályból, de akármennyi interfészből lehet örökölni.
  • Interfész ~ szerződés, metódusok és property-k lehetnek benne. Pl.:
    • =IComparable=: az osztály példányai összehasonlíthatók, rendezhetők
    • =IDisposable=: ha egy objektum nem memóriajellegű erőforrást (pl. adatbázis kapcsolatot) foglal,

megszűnésekor kézzel kell felszabadítani a =Dispose()= metódusban.

    • =IConvertible=: 17 metódus implementálásával lehetővé teszi az objektum konverzióját alap

típusokra.

    • =IClonable=: objektum lemásolását teszi lehetővé
    • =IEquatable=: két objektum egyenlőségét vizsgálja
    • =IFormattable=: formázott stringgé konvertál
  • Parciális osztály: 1 osztály kódja több file-ba van szétszedve.

Tipikus használat: generált és saját kód szétválasztása. 1.1-ben még nem volt.

  • Generikus osztályok: osztály paraméterezése típussal. =System.Collection.Generic= névtér. Pl. =Dictionary=, =List=, =Queue=. Gyorsabb és elegánsabb kódot lehet írni. Fordítási időben történik meg a típusellenőrzés. Csak akkor fordul, ha az összes behelyettesíthető típusra értelmes a kód. A típusra megkötések adhatók meg:
    • interfész: =where T: MyInterface=,
    • ősosztály: =where T: BaseClass=,
    • default konstruktor megléte: =where T: new()=,
    • érték vagy referencia típus.
    • többféle megkötés: =where T: BaseClass, new()=,

Események

Ugyanaz, mint 1.1-ben

  • =delegate=: típusos metódus referencia
  • =event=: objektum által küldött üzenet, aminek hatására meghívódnak az eseményre

beregisztrált eseménykezelők. Esemény deklarálása és kiváltása:

    1. =public delegate void MyEventHandler(object sender, EventArgs e);=
    2. =public event MyEventHandler MyEvent;=
    3. =if (MyEvent!=null) MyEvent(this, EventArgs.Empty);=
  • az eseménykezelő szignatúrája megegyezik az eseményével
    • első argumentuma (=object sender=) az eseményt kiváltó objektum
    • második argumentuma =EventArgs= leszármazott, az esemény paramétereit tartalmazza
  • regisztráció: esemény += eseménykezelő
public delegate void ValueChangedEventHandler(string message);
public event ValueChangedEventHandler changeEvent;
changeEvent += new ValueChangedEventHandler(metódusnév)

Attribútumok

Meta információ metódusra, típusra, osztályra, assemblyre. Lehetséges felhasználásai:

  • biztonsági előírások definiálása
  • képességek, pl. sorosítás deklarálása
  • leíró adatok hozzáfűzése

Type forwarding: típus elhelyezése másik assemblybe (

A

B

), hogy az =A= névtérben lévő alkalmazásokat ne kelljen újrafordítani.

Típuskonverzió

  • szűkítés (narrowing): C#-ban explicit konverzióval. Pl.
    double
    int
  • bővítés (widening): automatikus. Pl.
    int
    double
  • =IConvertible= interfész: 17 metódus, alap típusokra. Érvénytelen konverzió esetén
    InvalidCastException
    -t kell dobni.
  • =(cast)= operátor felüldefiniálása.
  • =ToString()= felüldefiniálása, hiba esetén
    Exception
    -t kell dobni.
    • Alapból az osztály típusát adja vissza.
    • Gyakran felüldefiniáljuk.
  • =Parse()= felüldefiniálása, hiba esetén
    Exception
    -t kell dobni.
  • =TryParse()= felüldefiniálása, hiba esetén a visszatérési érték =false=.

Boxing - Unboxing

Érték és referencia típus közötti automatikus átalakítás. Kerülendő, amikor lehet.

  • boxing: =int i=123; object o=(object)i;=
  • unboxing: =object o=123; int i=(int)o;=

Elkerülése:

  • generikus típusok használata
  • struktúráknál az absztrakt metódusok (pl. =ToString()=) legyenek felüldefinálva

-- Peti - 2007.06.27.