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és

Mi 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és

Amikor 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és

Szinte 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és

A 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.

A .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.