You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Feb 13, 2024. It is now read-only.
Copy file name to clipboardExpand all lines: manuscript/chapter2.adoc
+14-15Lines changed: 14 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,7 +3,7 @@
3
3
4
4
== Előkészítés
5
5
6
-
Első lépésként hozzunk létre egy .NET Core C# konzolalkalmazást: a projektsablon szűrőben válasszuk a C# nyelv - Windows platform - _Console_ projekttípust. A szűrt listában válasszuk _Console App_ sablont (most már *ne* a .NET Framework-ös legyen). A neve legyen _HelloCSharp2_. A solutiont ne tegyük külön mappába (_Place solution and project in the same directory_ legyen bekapcsolva). A megcélzott framework verzió legyen .NET 6.
6
+
Első lépésként hozzunk létre egy .NET Core C# konzolalkalmazást: a projektsablon szűrőben válasszuk a C# nyelv - Windows platform - _Console_ projekttípust. A szűrt listában válasszuk a _Console App_ sablont (most már *ne* a .NET Framework-ös legyen). A neve legyen _HelloCSharp2_. A solutiont ne tegyük külön mappába (_Place solution and project in the same directory_ legyen bekapcsolva). A megcélzott framework verzió legyen .NET 6.
7
7
8
8
=== Legfelső szintű utasítások, implicit globális névtér-hivatkozások
9
9
@@ -24,7 +24,7 @@ C# 10-ben a program belépési pontját adó forrásfájlt jelentősen lerövid
24
24
25
25
WARNING: Fontos észrevétel a fentiekből: ezen képesség nem változtatja meg a C# semmilyen alapvető jellemzőjét, például ugyanúgy minden függvénynek osztályon belül kell lennie. A fordítás során a legfelső szintű utasítások kódja úgy egészül ki, ami már minden szabálynak megfelel.
26
26
27
-
WARNING: A legfelső szintű kód olyan, amit a program más részéről nem tudunk hívni, hiszen nem is ismerjük a burkoló osztály nevét. Emiatt nincs értelme legfelső szintű kódban láthatósági beállításnak (`private`, `protcted`, stb.) vagy propertynek.
27
+
WARNING: A legfelső szintű kód olyan, amit a program más részéről nem tudunk hívni, hiszen nem is ismerjük a burkoló osztály nevét. Emiatt nincs értelme legfelső szintű kódban láthatósági beállításnak (`private`, `protected` stb.) vagy propertynek.
28
28
29
29
Akadályozzuk meg a program azonnali lefutását egy blokkoló hívással.
30
30
@@ -166,7 +166,7 @@ Tegyük fel, hogy egy kutyához bármilyen, üzleti logikában nem felhasznált
166
166
----
167
167
<1> A `new` operátor utáni konstruktorhívás sok esetben elhagyható, ha a bal oldal alapján amúgy is tudható a típus.
168
168
169
-
TIP: Az újabb projektsablonok sokkal kevesebb névtérdeklarációt (`using`) generálnak alapból. Ha kell vegyük fel a szükségeseket a fel nem oldott néven állva gyorsművelet (villanykörte) eszközzel (kbd:[CTRL+.])
169
+
TIP: Az újabb projektsablonok sokkal kevesebb névtérdeklarációt (`using`) generálnak alapból. Ha kell, vegyük fel a szükségeseket a fel nem oldott néven állva a gyorsművelet (villanykörte) eszközzel (kbd:[CTRL+.])
170
170
171
171
Az objektum inicializáló és az index inicializáló vegyíthető, így az alábbi módon tudunk felvenni további tulajdonságokat a kutyákhoz a legfelső szintű kódba:
172
172
@@ -191,7 +191,7 @@ var dogs = new Dictionary<string, Dog>
191
191
["watson"] = watson,
192
192
["unnamed"] = unnamed,
193
193
["unknown"] = unknown,
194
-
["pinmpedli"] = pimpedli
194
+
["pimpedli"] = pimpedli
195
195
};
196
196
197
197
foreach (var dog in dogs)
@@ -239,12 +239,11 @@ A szótár feltöltését megírhatjuk kollekció inicializációval is. Ehhez k
239
239
----
240
240
var dogs = new Dictionary<string, Dog>
241
241
{
242
-
{ nameof(banan), banan},
243
-
{ nameof(watson), watson},
244
-
{ nameof(unnamed), unnamed},
245
-
{ nameof(unknown), unknown},
246
-
{ nameof(pimpedli), pimpedli}
247
-
242
+
{ nameof(banan), banan },
243
+
{ nameof(watson), watson },
244
+
{ nameof(unnamed), unnamed },
245
+
{ nameof(unknown), unknown },
246
+
{ nameof(pimpedli), pimpedli }
248
247
};
249
248
----
250
249
@@ -304,7 +303,7 @@ Ha így futtatjuk az alkalmazást, az `AgeInDays` és a származtatott tulajdons
304
303
305
304
== Rekord típus
306
305
307
-
A rekord típusok speciális típusok, melyek
306
+
A rekord típusok speciális típusok, melyek:
308
307
309
308
- egyenlőségvizsgálat során érték típusokra jellemző logikát követnek, azaz két példány akkor egyenlő, ha adataik egyenlőek
310
309
- könnyen immutábilissá tehetők, könnyen kezelhetők immutábilis típusként
@@ -385,7 +384,7 @@ A `DogRec` típus alapvetően immutábilis, a példányainak alapadatai iniciali
385
384
[source,csharp]
386
385
----
387
386
/**/var watson3 = new DogRec(Guid.Empty, "Watson");
388
-
/**/var watson4 = new DogRec(Guid.Empty, "Watson", DateTime.Now.AddYears(-1));
387
+
/**/var watson4 = new DogRec(Guid.Empty, "Watson", DateTime.Now.AddYears(-1));
389
388
watson4.Name = watson3.Name + "_2"; //<= nem fordul
390
389
----
391
390
@@ -401,9 +400,9 @@ Ha immutábilis típusokkal dolgozunk, akkor mutáció helyett új példányt ho
401
400
WriteLine(watson5);
402
401
----
403
402
404
-
Futtatáskor a konzolban gyönyörködjünk a rekord típusok alapértelmezetten is olvasható szöveges kiírására.
403
+
Futtatáskor a konzolban gyönyörködjünk a rekord típusok alapértelmezetten is olvasható szöveges kiírásában.
405
404
406
-
A másoló kifejezésben a `with` operátor előtt megadjuk melyik példányt klónoznánk, majd az *inicializáció részeként* milyen értékeket állítanánk át, ehhez az objektum inicializációs szintaxist használhatjuk. Fontos eszünkbe vésni, hogy a másolás eredményeként új példány jön létre, új memóriaterület foglalódik le. Gondoljunk erre akkor, amikor egy ciklusban használjuk ezt a módszert sok egymást követő módosításra.
405
+
A másoló kifejezésben a `with` operátor előtt megadjuk, melyik példányt klónoznánk, majd az *inicializáció részeként* milyen értékeket állítanánk át, ehhez az objektum inicializációs szintaxist használhatjuk. Fontos eszünkbe vésni, hogy a másolás eredményeként új példány jön létre, új memóriaterület foglalódik le. Gondoljunk erre akkor, amikor egy ciklusban használjuk ezt a módszert sok egymást követő módosításra.
407
406
408
407
NOTE: Mire jó a rekord típus, az immutabilitás? Az immutábilis típussokkal való hatékony és eredményes munka másfajta, az imperatív nyelvekhez szokott fejlesztők számára szokatlan módszereket kíván. Vannak területek, ahol ez a befektetés megtérül, ilyen például a többszálú környezet. A legtöbb szálkezeléssel kapcsolatos probléma ugyanis a szálak által közösen használt adatstruktúrák mutációjára vezethető vissza (ún. _race condition_, versenyhelyzet). Nincs mutáció - nincs probléma. (_No mutation - no cry_)
409
408
@@ -463,7 +462,7 @@ TIP: Immutábilis környezetben törekedjünk arra, hogy a *teljes* adatstruktú
463
462
464
463
=== Normál megadás
465
464
466
-
Ha nincs szükségünk a kikényszerített immutabilitásra, akkor használhatjuk a rekord normál megadását. Fogjuk az `Dog` osztályt, másoljuk le a kódját, adjunk neki más nevet és `class` helyett `record` jelölőt. A `Dog` osztály fölé:
465
+
Ha nincs szükségünk a kikényszerített immutabilitásra, akkor használhatjuk a rekord normál megadását. Fogjuk a `Dog` osztályt, másoljuk le a kódját, adjunk neki más nevet és `class` helyett `record` jelölőt. A `Dog` osztály fölé:
0 commit comments