Vezérlőpult
B1. A típusrendszer · Változók és típusok

B blokk · Változók és típusok · 1. tananyag

A típusrendszer: változók, var, konstansok

Az A blokkban a programjaink csak kiírtak — mindig ugyanazt. Egy igazi program adatokkal dolgozik: megjegyzi a nevedet, számolja a pontjaidat. Ehhez kell a változó — és a C#-ban minden változónak típusa van, amelyet a fordító kérlelhetetlenül őriz. Itt válik el a C# láthatóan a JavaScripttől.

1 tanóraAz első változóidVisual Studio kell hozzá

Tanulási célok

1Mi a változó?

A változó (variable) elnevezett tárolóhely a memóriában. Képzeld feliratozott doboznak: a felirat a név, a doboz mérete és alakja a típus, a tartalma az érték — és a tartalom később cserélhető.

int kor = 17;

Szedjük szét, ahogy az A6-ban az első sort:

RészMi ez?Mit csinál?
inttípusmegmondja, milyen érték fér a dobozba: egész szám
kornév (azonosító)erre a névre hivatkozva érjük el az értéket
=értékadás (assignment)a jobb oldali értéket beteszi a bal oldali változóba
17kezdőértékez kerül a dobozba
;utasítás lezárása(A6)
A MEMÓRIA „DOBOZAI” kor : int 17 nev : string "Anna" magassag : double 1.72 A felirat a név és a típus — a tartalom cserélhető, de a doboz alakja (a típus) soha.
Változók a memóriában: név + típus a „felirat”, az érték a tartalom.

A deklaráció után a változó használható — kiírható, számolható vele, és új értéket is kaphat:

int kor = 17;
Console.WriteLine(kor);   // 17

kor = 18;                 // új érték — a régi felülíródik
Console.WriteLine(kor);   // 18
⚠️ FIGYELEM

Az = a C#-ban nem egyenlőség, hanem parancs: „tedd bele!” Ezért értelmes a kor = kor + 1; sor is: vedd elő a kor értékét, adj hozzá egyet, és tedd vissza ugyanoda. (Az egyenlőség-vizsgálat a == lesz — C blokk.)

2A C# erősen típusos — a fordító őrzi a dobozokat

A típus a deklarációnál egyszer és mindenkorra rögzül. A JavaScriptben ehhez képest a változó bármikor bármit tárolhat:

// JavaScript — ez simán lefut:
let adat = 5;
adat = "szöveg";     // a szám helyére szöveg került, senki sem szól
// C# — ugyanez fordítási hiba:
int adat = 5;
adat = "szöveg";     // ⛔ CS0029: Cannot implicitly convert type 'string' to 'int'

Ez a típusbiztonság, amit az A3-ban a CLR szolgáltatásai közt láttál — és a gyakorlatban azt jelenti: az ilyen hibát te látod meg fordításkor, nem a felhasználó futás közben. Elsőre szigorúnak tűnik, valójában a legjobb barátod.

3Az öt alaptípus — első kör

Most csak bemutatkoznak; mindegyikre visszatérünk részletesen a blokk további fejezeteiben.

TípusMit tárol?Példa literálRészletek
integész szám42, -3, 0B2
doubletizedes tört3.14, -0.5B3
stringszöveg"Szia!", "a" — idézőjelB4
charEGYETLEN karakter'a', '?' — aposztrófB4
boollogikai értéktrue, falseC blokk főszereplője

Három jelölési szabály, ami sok kezdő hibát megelőz:

  1. Idézőjel = string, aposztróf = char. A "A" szöveg (egybetűs), az 'A' karakter.
  2. A tizedes elválasztó a kódban mindig PONT (3.14) — akkor is, ha magyarul vesszőt írnánk.
  3. A számok jelölés nélkül állnak: 42 — se idézőjel, se aposztróf. A "42" nem szám, hanem szöveg!
string nev = "Anna";
int pontszam = 87;
double magassag = 1.72;
char monogram = 'A';
bool sikeres = true;

Console.WriteLine(nev);
Console.WriteLine(pontszam);
ℹ️ ELŐZETES

Változót szövegbe fűzni legszebben a string-interpolációval lehet: Console.WriteLine($"Szia, {nev}!"); — a $ jeles formát a B4-ben tanuljuk rendesen, de a feladatokban már most kipróbálhatod.

Melyik típusba való?

Nézd meg a literált — melyik típusú változóba tennéd?

1 / 8Pontszám: 0
…

4A var — típuskövetkeztetés, nem típustalanság

A var kulcsszóval a típus kiírását a fordítóra bízhatod:

var pontszam = 10;        // a fordító kikövetkezteti: int
var nev = "Anna";         // string
var magassag = 1.72;      // double

A var NEM a JavaScript let-je! A típust nem elhagyjuk, hanem a fordító kikövetkezteti a kezdőértékből — és onnantól ugyanolyan kőbe vésett, mintha kiírtad volna:

var pontszam = 10;
pontszam = "sok";         // ⛔ CS0029 — a pontszam bizony int!

Két következmény: a var-nak mindig kell kezdőérték (miből következtetne?), és csak lokális változóra használható.

💡 MIKOR MELYIK?

Ökölszabály: var-t akkor írj, ha a jobb oldalról ránézésre látszik a típus (var nev = "Anna";). Ha nem látszik, írd ki a típust — a kódot olvasó embernek segítesz vele (A9: a kódot többször olvassák, mint írják).

5Konstansok — ami sosem változik

Ha egy érték a program élete alatt garantáltan állandó, jelöld const-tal:

const int MaxProba = 10;
const double AfaKulcs = 0.27;

MaxProba = 12;            // ⛔ CS0131 — konstansnak nem adhatsz új értéket

Miért jó?

Elnevezés: a konstans PascalCase — mint látod, a MaxProba nagybetűvel kezdődik.

6Minden objektum — most már a te változóid is

Az A3-ban láttad: az int a System.Int32 álneve, és minden típus a System.Object leszármazottja. Most már saját változókon próbálhatod ki:

int kor = 17;
string nev = "Anna";

Console.WriteLine(kor.GetType());    // System.Int32
Console.WriteLine(nev.GetType());    // System.String
C#-álnév.NET-típusC#-álnév.NET-típus
intSystem.Int32stringSystem.String
doubleSystem.DoublecharSystem.Char
boolSystem.Boolean

A rövid álnevet gépeljük — de amikor a hibaüzenetben vagy a debuggerben Int32-t látsz, most már tudod: ugyanarról beszéltek.

7Elnevezési konvenciók

Mit enged a nyelv?

Az azonosító betűvel vagy aláhúzással kezdődik, utána betű, számjegy és _ állhat; a kis- és nagybetű különbözik (kor ≠ Kor — A6); kulcsszó (int, class, …) nem lehet változónév.

NévÉrvényes?Miért?
eletkor✔szabályos
pontszam2✔számjegy állhat benne, csak elöl nem
2pontszam⛔számmal kezdődik
elet kor⛔szóköz nem lehet benne (A9!)
int⛔kulcsszó
életkor✔ (de nem használjuk)az ékezet technikailag megengedett — mi ékezet nélkül írunk

Mit vár el a stílus?

  1. Lokális változó és konstans: változó camelCase (vegosszeg, hatralevoProba), konstans PascalCase (MaxProba).
  2. Beszédes név: a név mondja meg, MI van a dobozban. hatralevoProba — jó; hp, x2, asd — egy hét múlva neked is rejtvény.
  3. A tananyagban magyarul nevezünk el (ékezet nélkül): pontszam, nyertes, tippSzama — a keretrendszer nevei maradnak angolul (Console, WriteLine).
  4. A PascalCase másik fele (metódus, osztály) a D és H blokkban általános lesz — a szabályt már ismered: a Main és a WriteLine is így épül.

8Gyakorlat — változók a Locals ablakban

Az A9-ben megígértük: a debugger a változóknál válik igazán hasznossá. Itt az idő.

  1. Új projekt: Console App, név: Valtozok, .NET 10. Gépeld be:
int kor = 17;
string nev = "Anna";
double magassag = 1.72;

Console.WriteLine(nev);
Console.WriteLine(kor);

kor = kor + 1;
Console.WriteLine(kor);
  1. Tegyél töréspontot az első sorra (F9), indíts F5-tel.
  2. Nyisd meg alul a Locals ablakot (ha nem látszik: Debug → Windows → Locals).
  3. Lépkedj F10-zel, és figyeld a Locals-t: a változók sorban értéket kapnak — előbb kor = 17, aztán megjelenik a nev, a magassag…
  4. A kor = kor + 1; sornál állj meg: a Locals-ban a kor pirosra vált, amikor 17-ről 18-ra nő. A doboz tartalma a szemed előtt cserélődött ki!
  5. Kísérletezz a hibákkal is: írd be, hogy kor = "sok"; — nézd meg a CS0029-et az Error Listben, aztán javítsd vissza. Commitold a kész gyakorlatot (A7!).
✅ ELLENŐRZŐ PONT

Láttad a Locals ablakban a változóid értékét menet közben változni, és találkoztál a CS0029 hibával.

9Feladatok

Gyakorló feladatok

⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás

B1.1⭐

Deklarálj változót a saját adataidnak: neved (string), életkorod (int), magasságod (double), monogramod első betűje (char), „szeretem-e a pizzát” (bool). Írd ki mindet!

B1.2⭐

Melyik változónév érvényes, melyik nem — és miért? osszeg · 2ar · vegso osszeg · ar2 · double · hatralevoIdo

B1.3⭐⭐

Mi lesz a kimenet? Előbb papíron (A9: fejben futtatás!), aztán géppel:

int a = 5;
int b = a;
a = 10;
Console.WriteLine(a);
Console.WriteLine(b);

(A b vajon követi az a változását? A válasz sokat elárul a dobozokról!)

B1.4⭐⭐

A kódodban háromszor szerepel a 0.27 (áfakulcs). Alakítsd át konstanssá! Hogyan nevezed el, és miért lett jobb így a kód?

B1.5⭐⭐⭐

Írd be a sharplab.io-ra: var titok = 5; majd nézd meg a jobb oldali C# nézetben, mivé fordította a fordító a var-t. Próbáld ki var szoveg = "hello";-val is. Mit bizonyít ez a 4. szakasz állításából?

10Önellenőrző kvíz

Ellenőrizd magad!

Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.

11Fogalomtár

FogalomJelentés
változó (variable)elnevezett, típusos tárolóhely a memóriában
deklarációa változó bejelentése: típus + név (+ kezdőérték)
értékadás (assignment)az = művelet: a jobb oldali érték a bal oldali változóba kerül
erősen típusosa változó típusa rögzített; a fordító minden értékadást ellenőriz
literála kódba közvetlenül beírt érték: 42, 3.14, "Szia", 'a', true
vartípuskövetkeztetés: a fordító a kezdőértékből állapítja meg a (rögzült) típust
konstans (const)fordításkor rögzített, soha nem módosítható érték — PascalCase névvel
bűvös szám (magic number)kódba szórt, magyarázat nélküli számérték — konstanssal váltjuk ki
azonosító (identifier)a változó/metódus/osztály neve — betűvel vagy _-sal kezdődik
camelCasekisbetűvel kezdődő, szóhatáron nagybetűs írásmód: hatralevoProba

12Összegzés

  1. A változó elnevezett, típusos doboz: int kor = 17; — típus, név, értékadás, kezdőérték. Az = parancs: „tedd bele!”
  2. A C# erősen típusos: a típus a deklarációnál rögzül, a rossz értékadást a fordító már fordításkor elkapja (CS0029) — a JavaScripttel ellentétben.
  3. Az öt alaptípus: int, double, string (idézőjel), char (aposztróf), bool — a tizedes elválasztó a kódban mindig pont.
  4. A var nem típustalanság: a fordító a kezdőértékből következteti ki a típust, és az ugyanúgy rögzül.
  5. A const a soha nem változó értékeké — kimondja a szándékot, és kiváltja a bűvös számokat. Neve PascalCase.
  6. Minden objektum: a saját változóid is tudják a GetType()-ot — az int valójában System.Int32.
  7. Elnevezés: lokális változó camelCase, beszédes, nálunk magyarul, ékezet nélkül.