B blokk · Változók és típusok · 1. tananyag
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.
int,
double, string,
char, bool.var — és miért
NEM „típustalan változó".const)
egy értéknek.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ész | Mi ez? | Mit csinál? |
|---|---|---|
int | típus | megmondja, milyen érték fér a dobozba: egész szám |
kor | né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 |
17 | kezdőérték | ez kerül a dobozba |
; | utasítás lezárása | (A6) |
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
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.)
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.
Most csak bemutatkoznak; mindegyikre visszatérünk részletesen a blokk további fejezeteiben.
| Típus | Mit tárol? | Példa literál | Részletek |
|---|---|---|---|
int | egész szám | 42, -3, 0 | B2 |
double | tizedes tört | 3.14, -0.5 | B3 |
string | szöveg | "Szia!", "a" — idézőjel | B4 |
char | EGYETLEN karakter | 'a', '?' — aposztróf | B4 |
bool | logikai érték | true, false | C blokk főszereplője |
Három jelölési szabály, ami sok kezdő hibát megelőz:
"A" szöveg (egybetűs), az
'A' karakter.3.14) — akkor is, ha magyarul vesszőt írnánk.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);
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.
Nézd meg a literált — melyik típusú változóba tennéd?
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ó.
Ö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).
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.
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ípus | C#-álnév | .NET-típus |
|---|---|---|---|
int | System.Int32 | string | System.String |
double | System.Double | char | System.Char |
bool | System.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.
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 |
vegosszeg, hatralevoProba),
konstans PascalCase (MaxProba).hatralevoProba — jó; hp,
x2, asd — egy hét múlva
neked is rejtvény.pontszam, nyertes,
tippSzama — a keretrendszer nevei maradnak angolul
(Console, WriteLine).Main és
a WriteLine is így épül.Az A9-ben megígértük: a debugger a változóknál válik igazán hasznossá. Itt az idő.
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);
kor = 17,
aztán megjelenik a nev, a
magassag…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!kor = "sok"; — nézd meg a CS0029-et az Error
Listben, aztán javítsd vissza. Commitold a kész gyakorlatot (A7!).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.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
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!
Melyik változónév érvényes, melyik nem — és miért?
osszeg · 2ar ·
vegso osszeg · ar2 ·
double · hatralevoIdo
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!)
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?
Í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?
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelenté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ípusos | a változó típusa rögzített; a fordító minden értékadást ellenőriz |
| literál | a kódba közvetlenül beírt érték: 42, 3.14, "Szia", 'a', true |
var | tí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 |
| camelCase | kisbetűvel kezdődő, szóhatáron nagybetűs írásmód: hatralevoProba |
int kor = 17; — típus, név, értékadás,
kezdőérték. Az = parancs: „tedd bele!”int,
double, string
(idézőjel), char (aposztróf),
bool — a tizedes elválasztó a kódban mindig
pont.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.const a soha nem változó
értékeké — kimondja a szándékot, és kiváltja a bűvös számokat. Neve
PascalCase.GetType()-ot — az int
valójában System.Int32.