Áttekintés
Kiknek szól ez a cikk?
Hello minden érdeklődőnek. Zwiebel írt egy hasonló cikket c++ programozásról. A kommentek alapján azt hiszem, van igény "a szoftveres vonal erősítésére", ha szabad idéznem. Ha kettő van, az szerintem jobb, mintha egy sem lenne, így arra, gondoltam, hogy egy másik népszerű nyelvet próbálok bemutatni, a C#-ot (C sharp, kiejtése: szí-sárp) egy cikksorozatban. Leginkább azoknak szól ez a cikk, akiket érdekel a programozás, de semmilyen tapasztalatuk nincs, számukra szeretném nagy vonalakban bemutatni az alapjait. Meg azoknak, akik jobban értenek hozzá, és majd a fórumban jól kijavítanak, mert velem ellentétben igazuk van, és előre is köszönöm. Fontos még, hogy ez bemutató cikk, nem helyettesíthet szakkönyveket, kurzusokat, képzéseket.
Köszönetnyílvánítás
Statisztikák alapján az első oldalt állítólag jóval többen nézik meg, mint az utolsót, ezért itt szeretném megköszönni stevve-nek a segítségét. Úgy alakult, hogy egyszerre kezdtünk cikket írni ebben a témában, vagyis Ő előbb, de meglepetésemre abban állapodtunk meg, hogy jelenjen meg az én cikkem. Rendelkezésemre bocsájtotta a saját készülő cikkét, ami nagyon hasznos lett, és több helyen is idézek tőle.
Mi az a C#?
A C# a Microsoft által a .NET keretrendhez kifejlesztett programozási nyelv. A Microsoft által készített .NET keretrendszer (.NET Framework, kiejtés: dotnet) gyors alkalmazásfejlesztést, platformfüggetlenséget és hálózati átlátszóságot támogató szoftverfejlesztői platform. (Forrás: wiki csharp, wiki dotnet).
Vagy érthetőbben: ha programozni szeretnénk, akkor a Microsoft ajánlása a .NET-re történő fejlesztés, amihez a C# a legkézenfekvőbb választás.
Felhívás
Ha bárkinek a témával kapcsolatban kérdése van tegye fel nyugodtan, igyekszem javítani, és ha valami nincs kellőképpen elmagyarázva, akkor megpróbálom elmagyarázni, és a cikket igyekszem bővíteni az alapján, hogy másnak ne legyen gond. Ha valami hibás lenne, azt nagy örömmel javítom. Ha pedig nyelvtanszakértők jönnének, csak privátban írjanak. Nem szeretném, ha minden második hsz "ott hiányzik egy vessző, pedig muszáj" lenne.
Szükséges eszközök
Szükséges eszközök
Angol nyelvtudás
Nagyon alapfokú angol nyelvtudás erősen ajánlott.
Hardver
600MHz processzor, 1 GHz ajánlott.
192 MB RAM, 256 MB ajánlott.
1 GB hely a rendszerpartíción, és 2 GB azon a partíción, ahova telepíteni szeretnénk.
Természetesen minél erősebb a gépünk, annál jobban járunk, de ha ezt az oldalt sikerült betölteni, akkor körülbelül a követelmények is meglehetnek :)
Operációs rendszer
Windows 2000 sp4, Windows XP sp2, Windows Server 2003 sp1, vagy újabb.
Visual Studio Express
Ahhoz, hogy elkezdjünk programot írni, szükségünk lesz a Microsoft Visual Studio-ra. Ez egy kényelmes fejlesztőrendszer, és ami fontos, van ingyenes változata, ami a Microsoft oldalán elérhető: http://www.microsoft.com/express/download/#webInstall. Az oldal alján az Offline install alatt elérhető download-ot javaslom, ha valaki szeretné, hogy meglegyen később is a telepítő. Egy DVD képet fogunk ekkor letölteni. De elég a fenti, zöld téglalapban lévő online installer is. Ha ezt futtatjuk, akkor internetről letölti a szükséges komponenseket, és telepíti. A képfájl 750 MB, ami nemcsak a C#-ot tartalmazza, hanem a többi eszközt is, amit le lehet tölteni az oldalról. Az online installer jelentősen kevesebbet tölt le.
A telepítés értelemszerű, ha az alapbeállításokat hagyjuk mindenhol, akkor nagyon egyszerű.
Ha a telepítés megtörtént el is kezdhetjük első projektünket.
Projekt létrehozása
Visual Studio intdítása
A Start menüből indítsuk el a Visual Studio-t, vagy C# Express-t. Első indításnál kicsit várni kell, hogy előkészítse a fejlesztőkörnyezetet, de később gyorsabban fog indulni.
Ha elindul, ehhez hasonló képet fogunk látni:
Válasszuk a File menü New - New Project pontját.
Itt különböző projekt sablonok közül választhatunk, nekünk most a C# Console application-ra van szükségünk.
A Console Application-nel egy konzolos alkalmazást hozhatunk létre. Akkor érdemes ezt választani, ha nem grafikus, ablakos alkalmazást szeretnénk létrehozni, ha elég, hogy csak egy parancssoros ablak jelenik meg. Ne keverjük össze, egy konzolos alkalmazás nem 'DOS-os', ez windows, vagyis .NET alkalmazás lesz, viszont futtatáskor egy karakteres konzol ablakot kapunk.
Figyeljünk a projekt létrehozásakor a megadott adatokra! A Name mezőbe a projekt nevét írjuk, ez legyen az egyszerűség kedvéért Hello World. A Location -nél pedig azt a helyet adhatjuk meg, ahova a projektünket menteni szeretnénk. Rákattinthatunk az OK-ra.
Kész is az első programunk :) Ehhez hasonló képet kell kapjunk:
A képen pirossal bekarikáztam két részt, ha azokra kattintunk, akkor a felesleges eszközöket elrejthetjük. A Toolbox-ra és Properties ablakra webes, vagy ablakos windows projektek esetén lesz szükségünk. Jelenleg csak a kódra (program szövege) van szükség, és még a Solution explorer-t érdemes nyitva tartani, ami a programunk részeit képező fájlokat fogja össze, bár most azt sem fogjuk használni. Kisebb képernyőfelbontás esetén érdemes a nem szükséges részeket elrejteni, hogy jobban látszódjon az, amin éppen dolgozunk.
Mindjárt kicsit több helyünk van:
Program fordítása, és futtatása
A programunk jelenleg egy szöveges fájl. Ahhoz, hogy ezt fusson, le kell fordítani. Fordításnak nevezik azt a műveletet, amikor a forráskódból valamilyen eszköz segítségével létrehozunk egy olyan fájlt, amelyet a gép futtatni képes. .NET esetében nem natív gépi kódot kapunk, amit a processzorunk képes végrehajtani, hanem a .NET keretrendszer segítségével tudjuk futtatni.
Amikor a .NET framework-öt feltelepítjük a gépünkre, olyan, mintha egy 'virtuális számítógépet' hoznánk létre. A C# programokat a .NET Common Language Runtime (CLR) környezetében futtathatjuk. Ha az adott gépen nincs meg ez a CLR (.NET Framework), akkor a futtatás meghiúsul.
A fordító csupán egy köztes nyelvre, IL (Intermediate Language) fordít.
Ennek néhány előnye:
-biztonságosabb, mert a program futását a keretrendszer menedzseli
-nem kell a programot más operációs rendszerre lefordítani Pl: mono. Képes futtatni a támogatott platformokon a Visual Studio által generált bináris kódot.
-nem kell a programot más architektúrara fordítani. A futtató környezet 'elfedi' a mögötte lévő gépet. Lásd előző link.
Futás közben a programnak az éppen használt része kerül IL-ről gépi nyelvre fordításra, ami aztán megmarad a memóriában, így minden részt egyszer fordít le a CLR és kis késéssel áll össze a teljes program gépi nyelven. Ezt nevezik JIT (Just In Time), azaz épp időben történő fordításnak. Ennek van még egy előnye, amit érdemes megemlíteni: a gépi nyelvre fordításnál a fordító képes az éppen alatta lévő rendszerre optimalizálni - x86, PS3, ARM stb - , nem nekünk kell a programot
Kis kitérő után a fordítás: A fájl menüből Build, azon belül Build Solution, vagy Ctrl+Shift+B. Fordtítsuk le a programunkat!
Ha megnézzük a projektünk mappáját, akkor létrejött egy bin könyvtár, azon belül pedig Debug, és abban található a HelloWorld.exe fájlunk.
Futtatás: Debug menüpont, Start Debugging. Másik lehetőség, hogy a fájl menü alatti eszköztáron a zöld háromszögre kattintunk. F5 gomb megnyomásával is lehetséges. Vagy csak duplán kattintunk a HelloWorld.exe fájlunkra a Debug mappában.
Futtassuk le a programunkat! Azt csinálja, amit megadtunk neki, tehát gyakorlatilag semmit. Egy pár tizedmásodpercre felugrik valami fekete ablak, és eltűnik. A lényeg, hogy fut a programunk. Fejlesszük tovább!
Megjegyzés: Ha a futtatjuk Visual Studio-ból a programunkat, akkor a fordítást kihagyhatjuk, mert automatikusan lefordítja futtatás előtt a programot. Ha az exe fájlt a mappájából futtatjuk - ami fejlesztés közben szerintem kényelmetlen - akkor előtte mindig le kell fordítani a programot.
Szöveg kiíratása
Keressük meg az alábbi részt:
static void Main(string[] args)
{
}
Kattintsunk a nyitó { jel után, és nyomjunk egy Enter-t, hogy új sorba kerüljünk. Az alábbi két sort gépeljük be:
Console.WriteLine("Hello, World!");
Console.ReadKey();
Ekkor a teljes program így fog kinézni:
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();
}
}
}
Futtassuk a programot! Kiírja, hogy 'Hello, World!', és megáll. Ha leütünk egy billentyűt - nem a windows gombot, vagy Shiftet, meg egyebet :) - akkor továbbfut és kilép. A következő oldalon megvizsgáljuk, mit is tartalmaz a programunk.
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.