A forráskód elemzése
A teljes program:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
Console.ReadKey();
}
}
}
Névterek
namespace HelloWorld
{
...
}
A névterek arra használatosak, hogy bizonyos összetartozó komponenseket egybegyűjtsenek, és az eltérőeket különválasszák. A jobb megértéshez vegyünk egy leegyszerűsített példát, mondjuk egy vállalatot.
Legfelsőbb szinten a vállalat áll, amelyen belül sok mindent csoportosíthatunk. Legyen a vállalatnak egy tulajdonosa, osztályai és gyárai. A tulajdonos a vállalat egy fontos része, ami nem sorolható be a többi alkategórián belülre. Az osztályok egy alkategória a vállalaton belül. Két osztályt tartalmaz, pénzügy, és munkavédelem. A gyárak egy másik alkategória a vállalaton belül, ami két gyárat tartalmaz.
A példában három névtér szerepel: vállalat, vállalat.osztályok, vállalat.gyárak.
A vállalat a legkülső névtér, ezen belül a tulajdonos elem van. A vállalat.osztályok névtér pedig két elemet tartalmaz, ahogy a vállalatok.gyárak is. Ha a munkavédelmi osztályra van szükségünk, akkor úgymond a teljes elérési útja vállalat.osztályok.Munkavédelem, mert a munkavédelem a vállalat.osztályok névtér egy eleme.
Amikor létrehozzuk a projektünket, automatikusan kapunk egy névterek, amelyet a Visual Studio a projekt neve alapján generál.
A névtér a { jellel kezdődik, és addig tart, amíg a hozzá tartozó } jelhez nem érünk.
Névterekkel kapcsolatos a program első pár sora is:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
Ha nem szeretnénk az Munkavédelem osztályt mindig ilyen hosszan megadni, hogy vállalat.osztályok.Munkavédelem, akkor megmondhatjuk a kód elején, hogy szeretnénk, ha ismerné a vállalat.osztályok névteret a programunk. Ekkor elég csak Munkavédelem néven hivatkozni az osztályra.
Ezt így tehetjük meg:
using vállalat.osztályok;
A using szó jelentése: 'használva'. Körülbelül azt jelenti, hogy 'használjuk a vállalat.osztályok névteret'. Néhány névteret, amelyet gyakran használunk, automatikusan elérhetővé tesz a Visual Studio, ezt láthatjuk az első négy sorban. És valóban használjuk is, mert a kódunkban a Console a System névtér része. Ha nem lenne a using System, akkor csak System.Console formában lenne jó a kódunk. Töröljük ki az első sort! Pár pillanat múlva a Console szó pirosan alá lesz húzva, ezzel jelezve, hogy a Console ismeretlen.
Névteret létrehozni pedig így tudunk:
namespace NévtérNeve
{
...
}
Osztályok
A programunk következő vizsgálandó része:
class Program
{
...
}
Az osztályok - ne keverjük össze a példabeli osztályokkal, a class/osztály ebben az esetben programozással kapcsolatos fogalom - alapvető fontosságúak, de az egy kicsit bővebb témakör, ha lesz rá igény, akkor a 3. lecke környékén lenne érdemes foglalkozni velük.
Leegyszerűsítve most csak vegyünk annyit, hogy a névtereken belül létrehozhatunk class-okat, mint ahogy a programunkban is szerepel. A vállalatos példában a vállalat névtér egy osztályt tartalmaz, a tulajdonost, hasonlóan a másik két névtér két-két osztályt tartalmaz.
C#-ban minden végrehajtható kód, utasítás kötelezően - valamilyen típuson, leggyakrabban
class-okon belül kell legyen. Az osztályokon belül lehetnek tagok: adattagok, ha asz osztályunknak vagy egy példányának adatot kell tárolnia, és metódusok, amelyek a végrehajtható részt tartalmazzák. A mi osztályunk a HelloWorld is tartalmaz egy metódust, egy végrehajtható részt, méghozzá a static void Main(string[] args)-t.
Függvények, metódusok
Metódus: egy osztályon belüli függvény.
Függvény: ezt fogjuk most részletesebben megnézni. A programunk egyetlen függvénye:
static void Main(string[] args)
{
...
}
A static kulcsszó jelentésére most nem térünk ki, annak az osztályokkal kapcsolatban van jelentősége. A függvényeket el lehet képzelni valahogy úgy, mint ahogy matematikából tanultuk. Van valahány bemenete, végrehajt valamit, és van egy kimenete.
Vegyünk egy példát matematikából!
f(x) = 2*x + 1
A függvény bemenete az x szám. A művelet, amit végrehajt: x-et megszorozza 2-vel, és még hozzáad 1-et. A kimenete pedig a kapott szám lesz. Pl.: f(3) eredménye 7.
A programbeli függvényünk neve Main. A függvények neve előtti szó azt jelzi, hogy milyen típusú kimenetet kapunk a függvénytől. A Main ebből a szempontból kakukktojás, mert a void azt jelenti, hogy a függvénynek 'semmi' a kimenete, azaz nem kapunk semmit, ha végrehajtjuk. Az f függvényünk esetén mondhatjuk azt, hogy egy számot kapunk eredményül.
A Main függvény azért speciális, mert a programunk itt kezdi meg a futását. Ha átírjuk a Main-t másra, például f-re, fuggveny-re, vagy bármilyen elfogadható névre, és lefordítanánk a programunkat, akkor nem sikerül. A hiba oka az lesz, hogy a fordító nem találja a Main függvényt. Tehát a Main nagyon fontos, mert a programunk futása mindig azzal kezdődik.
Az f függvényünknek egy bemenete, úgynevezett paramétere van, az x. C#-ban a függvény neve után ( ) jelek között vesszővel elválasztva adhatjuk meg a paramétereket felsorolva. A paraméterek esetén meg kell adni először a típusát, majd a nevét, utána jöhet a következő paraméter. A Main függvényünknek egy paramétere van, a típusa string[], a neve args. A string[] args a programunk futtatásakor a parancssori paramétereket kapja, amit esetlegesen megadunk a programunknak.
A függvény által végrehajtott műveletet a függvény törzsében adhatjuk meg, a { és } jelek között.
A programunk utasításai
A programunk azt teszi, amit megadunk neki, hogy tegyen. Amikor a projektünket létrehoztuk, és lefuttattuk először, nem csinált semmit, mert nem adtunk meg semmit, amit tennie kellene. Ezután két utasítást írtunk:
Console.WriteLine("Hello, World!");
Console.ReadKey();
Az egyes utasításokat ;-vel kell elválasztani egymástól. Kódunkban egy System névtérbeli fontos osztályt, a Console-t használjuk. Ez a konzolos alkalmazásunk ki és bemenetét testesíti meg. A Console osztálynak sok metódusa van, az egyik gyakran használat metódusa a WriteLine. Jelen esetben a bemenete szöveg, szöveget a " " jelek között adhatunk meg. Ne tévesszen meg minket, a WriteLine metódusnak nincs kimenete, azaz void. Viszont a bemenetként kapott paramétert kiírja a képernyőre, mert ezt hajtja végre a metódus.
A második utasításunk a Console.ReadKey(). A ReadKey() függvénynek - pontosabban az általunk használt verziójának - nincs bemenete. A függvény vár egy billentyűleütésre, és ha megkapta, akkor kiírja konzolra, milyen karatkert írtunk be. Ha valamelyik gombot lenyomtuk, akkor a lenyomott gomb lesz a visszatérési értéke, azaz a függvény kimenete. Meg lehet vele határozni, hogy milyen gombot nyomtunk meg, de ezt nem tettük meg. Azért alkalmaztuk a ReadKey-t, hogy a programunk a WriteLine után ne lépjen ki azonnal. Töröljük ki a ReadKey-t, és láthatjuk, a kiírás után egyből ki is lép a programunk.
Végezetül
Eddig tartott a lecke, remélem sikerült jól fogalmaznom, és nagyon örülnék, ha valakinek hasznára lenne. Jó pár óra volt begépelni, de ha már egyvalaki elolvassa, és jónak gondolja, akkor megérte. Ha érdemes folytatni, kérlek jelezzétek, ha nem azt is :)
Köszönöm.
Tervezett anyagok:
2. Változók - adatok kiírása, beolvasása és, műveletek(összeadás, szorzás stb.) és hasonlók
3. Vezérlési szerkezetek - írd ki a számokat 1-től n-ig, csináld ezt x-szer és társai
4. osztályok, függvények
5. Készítsünk ablakos alkalmazást - gombot, saját hibaüzenetek gyártása és egyéb dolgok lazításképp
***UPDATE***
Folytatás: C# programozás - 2. lecke 2009.08.02. Vasárnap 20:00 privát bejegyzésben
Szombatra terveztem, de egy kis csúszás közbejött.