Programozzunk C#-ban – 2. rész

A mai leckében megismerkedünk a Visual Studio felülettel és a verziókezeléssel, valamint elkészítjük életünk első C# programját.

Verziókezelés

Szoftverfejlesztés során alapvető dolog, hogy az egyes kódváltozások nyomon követhetőek legyenek és igény szerint visszaállíthatóak legyenek a változtatások. Továbbá az sem hátrány, ha több ember tud dolgozni egy kódon egyszerre. Ennek hatékony eszköze a verziókezelés. Ehhez kell egy verziókezelő szoftver. Ebből igen sokfajta létezik, némelyik megoldás jobb, mint a másik, de alapvetően két csoportra bonthatóak a verziókezelő szoftverek. Vannak a klasszikus modellt követő szerver-kliens kialakításúak és az elosztott rendszerek.

Szerver-kliens megoldásból a legelterjedtebb rendszer az SVN. Ez a kódváltozásokat egy központi szerveren tárolja biztonságban, a helyi gépen csak egy, a fejlesztő által éppen módosított lokális változatot tárol.

Az elosztott rendszerek, mint a GIT esetén a verziókezelő, ami a fejlesztő gépén van, az egy szerver is. Ezen a fejlesztő korlátlan számú saját változatot tud tárolni a kódjából, amit ha jónak lát, akkor feltölthet egy másik, távoli GIT szerverre, amin a stabil, kiadásra szánt kódot tárolja. A GIT nagy hátránya az, hogy igen nagyméretű a Windows változata, mivel a GIT-et eredetileg a Linux fejlesztéséhez tervezték, így egy csomó olyan komponenst kell telepítenie, ami a Windows-ban gyárilag nincs meg. Ennek ellenére az egyik legnépszerűbb verziókezelő.

SVN rendszer esetén is meglehet csinálni az előzőt, azonban macerásabb. A sorozat írása során az SVN verziókezelőt fogom használni, mivel azzal a nagy előnnyel rendelkezik, hogy van hozzá kiforrott Windows Shell kiterjesztés, amivel a használata szinte gyerekjáték.

A kiterjesztés, amit telepíteni kell, a TortoiseSVN nevet kapja. Beszerezni a http://tortoisesvn.net/downloads.html címről lehet, a telepítése igen egyszerű.

Verziókezelést biztosító szolgáltatók

Az interneten számos nyílt forráskódú projektek fejlesztését megkönnyítő verziókezelő rendszer szolgáltató létezik. A szolgáltatók funkciókínálata mondhatni azonos, nagy eltérés a felhasználók számában van. Egy pár fontosabb szolgáltató:

  • CodePlex
    A Microsoft nyílt forráskódú projekt oldala, Team Foundation Server, SVN és GIT támogatással. A Team Foundation Server a Microsoft saját verziókezelő megoldása, sokáig csak ez volt elérhető a Visual Studio-ban, azonban a 2013-as változat egyik frissítésével elérhetővé vált a GIT támogatás is, köszönhetően a GIT népszerűségének.
  • Google Code
    A Google nyílt forráskódú projekt oldala, SNV, GIT és Mercurial (nagyjából azonos tudású a GIT verziókezelővel, de nem annyira népszerű) támogatással. Igen sok projekt megtalálható itt.
  • Github
    GIT-en alapuló, a jelenlegi legnépszerűbb nyílt forráskódú projekt publikációs oldal. A kódok GIT és SVN segítségével fel – és letölthetőek. Külön alkalmazást biztosítanak a rendszer használatához Windows rendszereken. A cikksorozat forráskódját is itt fogom közzétenni.

Első C# programunk

A Visual Studio elindítása után a File menüből válasszuk ki a New Project elemet. Ennek hatására megnyílik az új projekt varázsló, ahol különféle projektek közül választhatunk.

A Visual Studio úgynevezett Solution fájlokban gondolkodik. Egy Solution több projektet is tartalmazhat. A tényleges projektekből fog összeállni a nagy alkalmazás kódja. A sorozat további részeinek a kódja egy nagy Solution fájlban lesz elérhető, ezért a varázslóval egyenlőre csak egy üres Solution fájlt hozok létre, ami a Templates/Visual Studio Solutions szekcióban található.

Új, üres solution fájl létrehozásaA Solution fájl megnyitása után hozzá kell adni ténylegesen egy projektet. Ezt úgy tudjuk megtenni, hogy a CTRL+W,S gombokkal (CTRL+W, majd a CTRL gombot nyomva tartva S) megnyitjuk a Solution Explorert, vagy a View menün keresztül.

A Solutiont kijelölve bal gombbal kattintunk a nevén, majd a megjelenő menüben az Add menü New Project… menüpontjára kattintunk.

Új projekt hozzáadásaAz új projekt hozzáadása ablakban Visual C# szekció Console Application menüpontját válasszuk ki. A projektnek én a 01_Hello_World nevet adtam.

Csharp_01_04A Console Application egy parancssoros alkalmazás, grafikus felület nélkül. Grafikus alkalmazásokat a sorozat későbbi részeiben fogunk készíteni. Egyenlőre a nyelvi elemek megtanulásához azonban bőven elég parancssoros alkalmazásokat készíteni.

A projekt létrejötte után kezdhetnénk is a program írását, azonban egy esztétikai beállítást még végezzünk el. A Tools menüt lenyitva válasszuk ki az utolsó, Options menüpontot. A megjelenő ablakban meg keressük ki a Text Editior/All Languages beállítás panelt, majd a Line Numbers jelölőnégyzet mellé tegyünk egy pipát. Ez bekapcsolja a szerkesztőben a sorok számozását.

Sorszámozás beállításaA beállítás után nincs más dolgunk, mint megírni az első programunkat. Az alapértelmezetten generált forráskódba egy extra sort kell beírnunk, amit elég csak részben begépelnünk, mivel a Visual Studio rendelkezik egy nagyon fejlett kódkiegészítési funkcióval, amelyet InteliSense-nek neveznek. Ez a funkció minden támogatott nyelv esetén elérhető, de leginkább C# nyelvhez lett fejlesztve a funkció, mivel belsőleg nagyon támaszkodik .NET komponensekre.

InteliSense akcióban

A Hello World forráskódja:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _01_Hello_World
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Helló C# Világ!");
        }
    }
}

A kód using utasítások sokaságával kezdődik. Ezek névtereket vesznek használatba. A .NET keretrendszer beépített komponensei a System névtérben és annak alárendelt névtereiben találhatóak meg. Az, hogy melyik névteret tudjuk elérni a programunkból, attól függ, hogy milyen szerelvényeket (Assembly) rendeltünk a programhoz. A szerelvény egy DLL fájl, ami névtereket és osztályokat tartalmaz. A jelenlegi alkalmazás elkészítéséhez nem kell plusz szerelvényeket hozzárendelnünk a programhoz.

Minden programnak definiálnia kell egy saját névteret, ezért kezdődik a program egy namespace utasítással. A név azért kezdődik _ karakterrel, mivel az azonosítók nem kezdődhetnek számmal. A C és C++ megkötéseivel szemben azonban mindenféle karaktert tartalmazhatnak, még ékezetes betűket is, mivel a forráskódok UTF-8 kódolással tárolódnak.

A névtér lényegében arra jó, hogy elkülönítse az osztályok neveit és hatóköreit. Leginkább egy mappaként fogható fel.

Az egyetlen Program nevű osztályunk egy Main függvényt tartalmaz. Több osztályunk is lehet több Main függvénnyel, de az lesz a valódi fő függvény, amelyik statikus elérésű és Main nevű. A függvény a futtatási paramétereket egy szöveg típusú tömbön keresztül kapja meg. A C és C++ nyelvekkel ellentétben C# esetén a tömb is típus, ezért függvény eredményeként és argumentumaként is lehet tömböt használni.

A Console osztály a konzolt reprezentálja, amelybe adatokat tudunk bekérni és azokat kiírni. A Console osztály WriteLine függvénye egy sort ír a képernyőre, amely jelen esetben a “Helló C# Világ” üzenet. Kiíráskor itt is használhatunk speciális és ékezetes karaktereket.

C# és .NET esetén az osztályok és a függvények elnevezései az úgynevezett púpos teve írásmódot követik, ami azt jelenti, hogy ha egy osztály vagy függvény neve több szóból áll, akkor a szavak között nem kötőjellel vagy aláhúzással választjuk el a rész szavakat, hanem az egyes szavakat nagy kezdő betűvel, szóközök nélkül írjuk le. Ezt az elnevezési sémát érdemes betartani, ha kódot publikálunk.

Továbbá annak ellenére, hogy lehetőségünk van akár kínai karakterekkel teleszórni a programunkat, nem ajánlott sem ékezetes, sem speciális karaktereket használó elnevezéseket alkalmazni. Bevált gyakorlat, hogy a megjegyzéseket és a függvények elnevezéseit angol nyelven írjuk, főleg ha a kódunkat nagy közönség elé akarjuk tárni.

A program a Build menüből fordítható le a Build Solution parancs segítségével. Ez a teljes Solutionban található összes projektet lefordítja. Ha csak egy projektet szeretnénk lefordítani, azt a Solution Explorer-ből tudjuk megtenni úgy, hogy bal kattintunk a projekten, majd a Build parancsot választjuk.

Projekt forrásaHa mindent jól csináltunk, akkor az Output ablak megjelenik, ahol a fordítás eredményéről tájékozódhatunk.

Fordítási eredményekA projekt a Debug menüből indítható el. Két indítási lehetőségünk is van. Vagy hibakereső üzemmódban indítjuk el (Start Debugging) vagy hibakeresés nélkül (Start Without Debugging).

Indítás hibakeresés nélkülA hibakeresés opció különösen akkor hasznos, ha nem tudjuk, hogy a programunk pontosan mit csinál. Ebben az üzemmódban lehetőségünk van elhelyezni törési pontokat, amit ha elér a program futás közben, akkor átvált lépésenkénti végrehajtásra. A lépésenkénti végrehajtásban az egyes lépések lefutása előtt lehetőségünk van elemezni a program működését.

Jelen alkalmazás esetén viszont nem sok értelme van a hibakereső üzemmódnak, mivel semmi érdekeset nem csinál az alkalmazás. Ezért a Start Without Debugging menüt válasszuk. Ennek hatására elindul a programunk, ami kiírja a korábban bevitt szöveget.

 Github és SVN használata

Github regisztráció létrehozása után lehetőségünk van projekteket létrehozni. Ehhez kell találni a projektnek egy nevet és meg kell adni a projekt leírását, valamint azt, hogy publikus vagy privát tárolót hozunk létre. Privát tárolók használata fizetős, azonban így nem csak nyílt forráskódú projektet fejleszthetünk a Github előnyeivel. Az árazás tárolónként eltér, a legolcsóbb konstrukció 5 tárolót kínál havi 7$ (~1700Ft) előfizetésért.

Új Githib projekt létrehozásaLicenc szerződés esetén van bőven választási lehetőségünk, a példák kódjait MIT Licenc feltételei alatt adom ki. Ez nagyjából azt fogalmazza meg, hogy a kódért semmilyen felelősséget nem vállalok, cserébe viszont akár kereskedelmi termékbe is beépítheted a példákban szereplő kódokat.

A projekt létrejötte után kódpublikáláshoz először le kell töltenünk a tároló tartalmát. Ezt a projekt oldalán található URL címmel tudjuk megtenni. Ha a Subversion linkre kattintunk, az URL egy SVN által letölthető tárolóra fog mutatni.

SVN kiválasztásaLetölteni Tortoise SVN segítségével úgy tudunk, hogy megnyitjuk a Windows Intézőt és egy üres mappában bal kattintás után megjelenő menüben az SVN Chekout… opciót választjuk. Ez megnyitja a letöltési ablakot, ahol meg kell adni a címet, amiről letölteni szeretnénk.

Csharp_01_14Letöltésnél lehetőségünk van megadni a verziót is. A HEAD revision minden esetben a legfrissebb változatot jelöli. Az egyes verziók között egyszerűen a Show Log parancs segítségével tudunk navigálni. Az OK gomb megnyomása után megindul a kód letöltése. Ez a kód méretétől és az internetkapcsolat sebességétől függően eltarthat egy ideig.

Ha módosítottuk a kódot, és menteni szeretnénk a változásokat, akkor abban a mappában, ahova letöltöttük a kódot, a bal kattintással előjövő menüben az SVN Commit… menüpontot kell választani.

Ha nem szeretnénk menteni és az utolsó változatot szeretnénk visszaállítani, akkor szintén bal kattintás, majd Tortoise SVN menüpont és azon belül Revert opció.

Kód mentése

A mentés ablakban meg kell adni egy rövid leírást arról, hogy mit is csinál a módosítás, amit menteni kívánunk. Érdemes rendszeresen és nem semmit mondó üzenetekkel kitölteni. Az ablakban lehetőségünk van kiválasztani a menteni kívánt fájlokat. Az összes fájl az ablakba belekattintva a CTRL+A gombok segítségével jelölhető ki, majd egy kattintás kell bármelyik jelölőnégyzetbe és az összes fájlt kijelöltük mentésre.

Felhasználónév és jelszó megadása

Az OK gomb megnyomása után indul a mentés, amely egy felhasználónevet és jelszót kér. Ez azonos a Github felhasználónevünkkel és jelszavunkkal. Csak olyan tárolókba tudunk menteni, amelyeknek mi vagyunk a tulajdonosai, vagy a tároló tulajdonosa adott mentési jogot.

A mentés végeztével egy összefoglaló statisztikát kapunk, hogy a mentés sikeres vagy sikertelen volt.

Kód mentésének állapota

A cikkhez tartozó forráskód a https://github.com/webmaster442/csharppeldak címről szerezhető be.

Legközelebb

A sorozat következő részében áttekintjük az alap típusokat, beszélünk a C# objektum modelljéről és a készítünk egy kicsivel bonyolultabb alkalmazást is.