C Sharp programozás/Hello C Sharp
A híres-hírhedt “Hello World!” program elsőként Dennis Ritchie és Brian Kerningham “A C programozási nyelv” című könyvében jelent meg, és azóta szinte hagyomány, hogy egy programozási nyelv bevezetőjeként ezt a programot mutatják be. Semmi mást nem csinál, mint kiírja a képernyőre az üdvözletet.
Az első program
szerkesztésMi itt most nem a világot, hanem a C# nyelvet üdvözöljük, ezért ennek megfelelően módosítsuk a forráskódot:
using System;
class HelloWorld
{
static public void Main()
{
Console.WriteLine("Hello C#!");
Console.ReadKey();
}
}
Mielőtt lefordítjuk tegyünk pár lépést a parancssorból való fordítás elősegítésére. Ahhoz, hogy így is le tudjunk fordítani egy forrásfile –t, vagy meg kell adnunk a fordítóprogram teljes elérési útját (ez a mi esetünkben elég hosszú) vagy a fordítóprogram könyvtárát fel kell venni a PATH környezeti változóba.
Ez utóbbihoz Vezérlőpult/Rendszer -> Speciális fül/Környezeti változók. A rendszerváltozók listájából keressük ki a Path –t és kattintsunk a Szerkesztés gombra. Most nyissuk meg a Sajátgépet, C meghajtó, Windows mappa, azon belül Microsoft.NET/Framework. Nyissuk meg vagy a v2.0… vagy a v3.5.. kezdetű mappát (attól függően, hogy C# 2.0 vagy 3.0 kell). Másoljuk ki a címsorból ezt a szép hosszú elérést. Vissza a Path –hoz. A változó értéke sorban navigáljunk el a végére, írjunk egy pontosvesszőt (;) és illesszük be az elérési utat. Mindent OK –zunk le és kész. Ha van megnyitva konzol vagy PowerShell azt indítsuk újra, utána írjuk be, hogy csc. Azt kell látnunk, hogy Microsoft ® Visual C# 2008 Compiler Version 3.5… Itt az évszám és verzió változhat, ez a C# 3.0 üzenete.
Most már fordíthatunk a
csc filenev.cs
paranccsal (természetesen a szöveges file kiterjesztése „.txt”, így nevezzük át mivel a C# forráskódot tartalmazó file -ok kiterjesztése „.cs”).
Az első sor megmondja a fordítónak, hogy használja a System névteret. Ezután létrehozunk egy osztályt, mivel a C# teljesen objektumorientált ezért utasítást csakis osztályon belül adhatunk. A “HelloWorld” osztályon belül definiálunk egy Main nevű statikus függvényt, ami a programunk belépési pontja lesz. Minden egyes C# program a Main függvénnyel kezdődik, ezt mindenképpen létre kell hoznunk. Végül meghívjuk a Console osztályban lévő WriteLine(…) és ReadKey(…) függvényeket. Előbbi kiírja a képernyőre a paraméterét, utóbbi vár egy billentyűleütést. Ebben a bekezdésben szerepel néhány (sok) kifejezés ami ismeretlen lehet, a jegyzet későbbi fejezeteiben mindenre fény derül majd.
A C# szintaktikája
szerkesztésAmikor egy programozási nyelv szintaktikájáról beszélünk, akkor azokra a szabályokra gondolunk, amelyek megszabják a forráskód felépítését. Ez azért fontos, mert az egyes fordítóprogramok az ezekkel a szabályokkal létrehozott kódot tudják értelmezni. A C# C-stílusú szintaxissal rendelkezik (azaz a C programozási nyelv szintaxisához hasonlít), ez három fontos kitételt von maga után:
- Az egyes utasítások végén pontosvessző (;) áll
- A kis- és nagybetűk különböző jelentőséggel bírnak, azaz a “program” és “Program” azonosítók különböznek. Ha a fenti kódban Console.WriteLine(…) helyett console.writeline(…) –t írnánk a program nem fordulna le.
- A program egységeit (osztályok, metódusok, stb.) ún. blokkokkal jelöljük ki, a kapcsos zárójelek ({, }) segítségével.
Kulcsszavak
szerkesztésSzinte minden programnyelv definiál kulcsszavakat, amelyek speciális jelentőséggel bírnak a fordító számára. Ezeket az azonosítókat a saját meghatározott jelentésükön kívűl nem lehet másra használni, ellenkező esetben a fordító hibát jelez. Vegyünk például egy változót, aminek az “int” nevet akarjuk adni. Az “int” egy beépített típus neve is, azaz kulcsszó, ezért nem fog lefordulni a program:
int int; //hiba
A legtöbb fejlesztőeszköz megszínezi a kulcsszavakat (is), ezért könnyű elkerülni a fenti hibát. A C# 77 darab kulcsszót ismer:
abstract | default | foreach | object | sizeof | unsafe |
as | delegate | goto | operator | stackalloc | ushort |
base | do | if | out | static | using |
bool | double | implicit | override | string | virtual |
break | else | in | params | struct | volatile |
byte | enum | int | private | switch | void |
case | event | interface | protected | this | while |
catch | explicit | internal | public | throw | |
char | extern | is | readonly | true | |
checked | false | lock | ref | try | |
class | finally | long | return | typeof | |
const | fixed | namespace | sbyte | uint | |
continue | float | new | sealed | ulong | |
decimal | for | null | short | unchecked |
Ezeken kívűl létezik még 23 darab azonosító, amelyeket a nyelv nem tart fenn speciális használatra, de különleges jelentéssel bírnak. Amennyiben lehetséges kerüljük a használatukat “hagyományos” változók, metódusok, osztályok létrehozásánál:
add | equals | group | let | remove | var |
ascending | from | in | on | select | where |
by | get | into | orderby | set | yield |
descending | global | join | partial | value |
Néhányuk a környezettől függően más-más jelentéssel is bírhat, a megfelelő fejezet bővebb információt ad majd ezekről az esetekről.
Megjegyzések
szerkesztésA forráskódba megjegyzéseket tehetünk. Ezzel egyrészt üzeneteket hagyhatunk (pl. egy metódus leírása) magunknak, vagy a többi fejlesztőnek, másrészt a kommentek segítségével dokumentációt tudunk generálni, ami szintén az első célt szolgálja csak éppen élvezhetőbb formában. Megjegyzéseket a következőképpen hagyhatunk:
using System;
class HelloWorld
{
static public void Main()
{
Console.WriteLine("Hello C#"); // Ez egy egysoros komment
Console.ReadKey();
/*
Ez egy többsoros komment
*/
}
}
Az egysoros komment a saját sora legvégéig tart, míg a többsoros a két “/*” –on belül érvényes. Utóbiakat nem lehet egymásba ágyazni:
/*
/* */
*/
Ez a “kód” nem fordul le. A kommenteket a fordító nem veszi figyelembe, tulajdonképpen a fordítóprogram első lépése, hogy a forráskódból eltávolít minden megjegyzést.
Névterek
szerkesztésA .NET Framework osztálykönyvtárai szerény becslés szerint is legalább tízezer nevet, azonosítót tartalmaznak. Ilyen nagyságrenddel elkerülhetetlen, hogy a nevek ismétlődjenek. Ekkor egyrészt nehéz eligazodni köztük, másrészt a fordító is megzavarodhat. Ennek a problémának a kiküszöbölésére hozták létre a névterek fogalmát. Egy névtér tulajdonképpen egy virtuális doboz, amelyben a logikailag összefüggő osztályok, metódusok, stb… vannak. Nyilván könyebb megtalálni az adatbázis kezeléshez szükséges osztályokat, ha valamilyen kifejező nevű névtérben vannak (System.Data).
Névteret magunk is definiálhatunk, a namespace kulcsszóval:
namespace MyNameSpace
{
}
Ezután a névterre vagy a program elején a using –al, vagy az azonosító elé írt teljes eléréssel hivatkozhatunk:
using MyNameSpace;
//vagy
MyNameSpace.Valami
A jegyzet első felében főleg a System névteret fogjuk használni, ahol más is kell ott jelezni fogom.