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
Copy file name to clipboardExpand all lines: docs/seminar/01-csharp1/chapter1.md
+23Lines changed: 23 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -340,3 +340,26 @@ Nem kell az `Add` függvényhívást és a lista referenciát kiírni, egyértel
340
340
Ez a forma is ugyanolyan `Add` függvényhívásokra fordul, mint az eredeti változatban.
341
341
342
342
Próbáljuk ki az alkalmazást! Láthatjuk, hogy a konstruktoron keresztül teljesen inicializálható `Person` példányok esetében a kiírás teljes, viszont vannak olyan `Student` példányok, ahol a kiírás üres értékeket talál. Ezzel a jelenséggel a következő gyakorlatokon tovább foglalkozunk.
343
+
344
+
C# új verziójában megjelent a Collection Expression szintaxis is, amivel a kollekció inicializálás még egyszerűbbé válik, aminek a szintaxisa a `[]` között megadott elemekből áll. Itt nem kell megadni a típust sem, a fordító automatikusan kitalálja azt a bal oldalból, és működik a legtöbb kollekció típussal és tömbbel is.
Copy file name to clipboardExpand all lines: docs/seminar/02-csharp2/chapter2.md
+15-10Lines changed: 15 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -47,7 +47,7 @@ dotnet <projektnév.dll>
47
47
```
48
48
49
49
!!! tip "Parancssor aktuális mappája"
50
-
A dotnet parancshoz a dll könyvtárában kell lennünk. Ehhez a legegyszerűbb, ha a Windows fájlkezelőben a megfelelő könyvtárban állva az elérési útvonal mezőt átírjuk a `cmd` szövegre, majd kbd:\[ENTER\]-t nyomunk.
50
+
A dotnet parancshoz a dll könyvtárában kell lennünk. Ehhez a legegyszerűbb, ha a Windows fájlkezelőben a megfelelő könyvtárban állva az elérési útvonal mezőt átírjuk a `cmd` szövegre, majd ++enter++-t nyomunk.
51
51
52
52
Adjunk a létrejövő projekthez egy `Dog` osztályt *Dog.cs* néven, ez lesz az adatmodellünk:
53
53
@@ -87,7 +87,7 @@ Ebben az esetben a típus egyértelműen `Dog`.
87
87
Ha csak deklarálni szeretnénk egy változót (nem adunk értékül a változónak semmit), akkor nem használhatjuk a `var` kulcsszót, ugyanis nem következik a kódból a változó típusa.
88
88
Ekkor explicit meg kell adnunk a típust.
89
89
90
-
```csharp hl_lines="5-10"
90
+
```csharp hl_lines="6-11"
91
91
Dogbanan=newDog
92
92
{
93
93
Name="Banán",
@@ -97,15 +97,15 @@ var watson = new Dog { Name = "Watson" };
* Fordítási hiba: a `watson` deklarációjakor eldőlt, hogy ő `Dog` típus, utólag nem lehet megváltoztatni és például számértéket értékül adni. Ez nem JavaScript.
108
-
* Fordítási hiba: implicit típust csak úgy lehet deklarálni, ha egyúttal inicializáljuk is. Az inicializációs kifejezés alapján dől el (implicit) a példány típusa.
107
+
1. Fordítási hiba: a `watson` deklarációjakor eldőlt, hogy ő `Dog` típus, utólag nem lehet megváltoztatni és például számértéket értékül adni. Ez nem JavaScript.
108
+
2. Fordítási hiba: implicit típust csak úgy lehet deklarálni, ha egyúttal inicializáljuk is. Az inicializációs kifejezés alapján dől el (implicit) a példány típusa.
109
109
110
110
Próbáljuk ki a nem forduló sorokat, nézzük meg a fordító hibaüzeneteit!
@@ -217,7 +217,9 @@ var dogs = new Dictionary<string, Dog>
217
217
};
218
218
219
219
foreach (vardogindogs)
220
+
{
220
221
Console.WriteLine($"{dog.Key} - {dog.Value}");
222
+
}
221
223
```
222
224
223
225
Próbáljuk ki - minden név-kutya párt ki kell írnia a szótárból.
@@ -236,7 +238,9 @@ var dogs = new Dictionary<string, Dog>
236
238
//ArgumentNullException!
237
239
```
238
240
239
-
Ez azonban kivételt okoz, amikor a kutya neve nincs kitöltve, azaz `null` értékű. Esetünkben elég lenne az adott változó neve szövegként. Erre jó a `nameof` operátor.
241
+
Ez azonban kivételt okoz, amikor a kutya neve nincs kitöltve, azaz `null` értékű.
242
+
Esetünkben elég lenne az adott változó neve szövegként.
243
+
Erre jó a `nameof` operátor.
240
244
241
245
```csharp
242
246
vardogs=newDictionary<string, Dog>
@@ -253,7 +257,8 @@ Ez a változat már nem fog kivételt okozni.
253
257
254
258
A `nameof` operátor sokfajta nyelvi elemet támogat, vissza tudja adni egy változó, egy típus, egy property vagy egy függvény nevét is.
255
259
256
-
A szótár feltöltését megírhatjuk kollekció inicializációval is. Ehhez kihasználjuk, hogy a szótár típus rendelkezik egy `Add` metódussal, amelyik egyszerűen egy kulcsot és egy hozzátartozó értéket vár:
260
+
A szótár feltöltését megírhatjuk kollekció inicializációval is.
261
+
Ehhez kihasználjuk, hogy a szótár típus rendelkezik egy `Add` metódussal, amelyik egyszerűen egy kulcsot és egy hozzátartozó értéket vár:
Ha bármi más alapján szeretnénk keresni a kutyák között (pl. a neve tartalmaz-e egy adott szövegrészt), mindig egy új segédfüggvényt kell készítenünk, ami rontja a kód újrahasznosíthatóságát.
58
58
59
59
Oldjuk meg úgy, hogy az általános problémát is megoldjuk!
60
60
Ehhez az szükséges, hogy a kollekciónk egyes elemein kiértékelhessünk egy, a hívó által megadott predikátumot.
61
61
Készítsük el az általánosabb változatot, ehhez felhasználhatjuk a `ListDogsByNamePrefix` kódját.
@@ -450,9 +450,13 @@ A fát kóddá fordíthatjuk a `Compile` metódus segítségével, mely a leford
450
450
Console.WriteLine(e.Compile()(5));
451
451
```
452
452
453
-
Bár az `Expression<>` emiatt okosabb választásnak tűnik, ám a LINQ-to-Objects alapinterfészének (ami a lekérdezőfüggvényeket biztosítja) függvényei `Func<>` / `Action<>` delegátokat várnak. Ami nem csoda, hiszen memóriabeli listákat általában sima programkóddal dolgozunk fel, nincs értelme felépíteni kifejezésfát csak azért, hogy utána egyből kóddá fordítsuk. Emellett más, memóriabeli adatokon dolgozó LINQ technológia is létezik, pl. LINQ-to-XML saját API-val (nem `IEnumerable<>` alaptípussal).
453
+
Bár az `Expression<>` emiatt okosabb választásnak tűnik, ám a LINQ-to-Objects alapinterfészének (ami a lekérdezőfüggvényeket biztosítja) függvényei `Func<>` / `Action<>` delegátokat várnak.
454
+
Ami nem csoda, hiszen memóriabeli listákat általában sima programkóddal dolgozunk fel, nincs értelme felépíteni kifejezésfát csak azért, hogy utána egyből kóddá fordítsuk.
455
+
Emellett más, memóriabeli adatokon dolgozó LINQ technológia is létezik, pl. LINQ-to-XML saját API-val (nem `IEnumerable<>` alaptípussal).
454
456
455
-
A nem memóriabeli adatokon, hanem például külső adatbázisból dolgozó LINQ provider-ek viszont `IQueryable<>`-t valósítanak meg. Az `IQueryable<>` az `IEnumerable<>`-ból származik, így neki is vannak `Func<>` / `Action<>`-ös függvényei, de emellett `Expression<>`-ösek is. Ez utóbbiak teszik lehetővé, hogy ne csak .NET kódot generáljanak a lambda kifejezésekből, hanem helyette pl. SQL kifejezést - hiszen egy relációs adatbázis adatfeldolgozó nyelve nem .NET, hanem valamilyen SQL dialektus.
457
+
A nem memóriabeli adatokon, hanem például külső adatbázisból dolgozó LINQ provider-ek viszont `IQueryable<>`-t valósítanak meg.
458
+
Az `IQueryable<>` az `IEnumerable<>`-ból származik, így neki is vannak `Func<>` / `Action<>`-ös függvényei, de emellett `Expression<>`-ösek is.
459
+
Ez utóbbiak teszik lehetővé, hogy ne csak .NET kódot generáljanak a lambda kifejezésekből, hanem helyette pl. SQL kifejezést - hiszen egy relációs adatbázis adatfeldolgozó nyelve nem .NET, hanem valamilyen SQL dialektus.
456
460
457
461
### A LINQ providerek általános működése
458
462
@@ -462,4 +466,4 @@ Kimenetük: az adatforrásnak megfelelő nyelvű, a query-t végrehajtó kód (.
462
466
463
467
LINQ-to-Objects esetén nincs valódi LINQ provider (a provider az `IQueryable.Provider`-en keresztül érhető el, de a `List<>` nem `IQueryable`!), hiszen nincs feladata: kódot kap bemenetül, ugyanazt kellene kimenetül adnia. A *LINQ-to-XML* is hasonló elven működik.
464
468
465
-
Valódi LINQ providert valósít meg például az *Entity Framework*, de ezt a technológiát később tárgyaljuk.
469
+
Valódi LINQ providert valósít meg például az *Entity Framework Core*, de ezt a technológiát később tárgyaljuk.
0 commit comments