O kompaniji
24
Iskustva
14
Plate
Poslovi
INGSOFTWARE logo

INGSOFTWARE

4.7
25.10.2022.

Najkul novosti iz .NET 5 i 6 - Lagani pregled za zauzete developere

Pavle Davitković - Paja, .NET Developer (Ingsoftware)

UVOD

Microsoft je odredio datum početka .NET Conf 2022, što znači da nam se release .NET 7-ice veoma približio. Kako tvrde, sedmica će biti još brža i lakša⚡no prethodne verzije, a i generisaće značajno veći FOMO nama koji se možda i nećemo tako skoro na nju upgrade-ovati 😅.

Ne znam za tebe, al’ za nas “obične smrtnike”, kojima je razvoj i održavanje real-world produkcionih sistema full-time posao, ispratiti sve novosti u poslednjim verzijama dev alata i okruženja je… kad-ću-pa-stignem-sve-da-ispratim mukica 😱. Pored toga, većina .NET developera u mom okruženju (uključujući i mene) primarno radi s verzijom .NET-a starijom od petice.

Stoga, reših da se najpre edukujem na temu “šta si sve propustio ukoliko nisi ispratio poslednjih par verzija .NET-a”, a potom i da napišem ovaj sažvakani pregled, u “za zauzete developere” stilu, za sve one koji, poput mene, broje dane do izlaska sedmice 😇. A o samoj sedmici u nekom od narednih postova 😉. 

Dakle, u nastavku teksta ćemo se osvrnuti na ono što su (po meni) “crème de la crème” vesti iz poslednje dve verzije .NET-a (5 i 6) - šta je novo, šta izbačeno, a šta je diglo najviše prašine. Top-level statements, records, minimal API, global usings, file-scoped namespaces, itd. - samo su neke od kul novina koje ćemo pomenuti, so stay tuned 😊. 

I bez brige, nemoj da te dužina članka uplaši - ipak je ovo lagani pregled za zauzete developere - znači ništa teorija, ništa dubioze, ništa interpretacija - samo code snippets i mimovi 😄 (uz minimalno konteksta). 

Kako je od .NET Framework i .NET Core ispalo “samo” .NET?!

Microsoft je na primeru .NET-a demonstrirao kako je naming things jedna od dve najteže stvari u računarstvu

Podsećanja radi, originalne verzije .NET-a su se zvale .NET Framework i bile su samo za Windows. Godine 2014, Microsoft najavljuje .NET Core - cross-platform implementaciju .NET-a. Potom, neko vreme traje paralelni razvoj .NET Framework-a (do v4.x) i .NET Core-a (dogurao do v3.x). A onda, novembra 2020. izlazi naslednik verzije .NET Core 3.1 - i to pod imenom .NET 5 (četvorka preskočena kako bi se izbegla konfuzija s verzijom .NET Framework-a). Petica ujedno postaje i glavna implementacija .NET-a, na kojoj će se bazirati sav dalji razvoj (.NET Framework će nadalje dobijati samo security bugfixes). 

U trenutku pisanja ovog blog posta, aktuelna verzija je .NET 6 i izašla je novembra 2021. Microsoft planira da nadalje izbacuje godišnje release-ove, svakog novembra (a LTS, tj. long-term-support verzije, na svake 2 godine).

Š’a ima novo u .NET 5?

Početak unifikacije platforme

Ovom verzijom je započet (mamutski) proces unifikacije platforme, što označava kraj .NET Framework (Windows), Xamarin (mobile) i .NET Core (cross-platform) ere, a početak jedinstvene .NET ere. Detaljnije o razlici između ovih implementacija možete pronaći u ovom videu.

Prvobitni plan Microsoft-a je bio da se unifikacija kompletira u ovoj verziji, ali zbog svetskih problema u prethodnom periodu nije završena (jer se kasnilo sa release-om .NET MAUI-a), te je završetak procesa ostavljen za sledeću verziju.

C# 9

NET 5 dolazi u paketu sa C# 9, koji je doneo razne novosti. U nastavku su samo meni najinteresantnije, a sve ostale novosti iz C# 9 se mogu pronaći ovde

Records

Records su class-based tipovi koji se ne mogu menjati nakon kreiranja. Može se reći da records imaju best of both worlds (klase i strukture), jer su po prirodi referentni tipovi kao klase, ali upoređivanje se vrši po vrednosti kao kod struktura. Direktna manipulacija nije moguća, ali kloniranje record-a pomoću with ključne reči i promeni željena vrednost moguća.

Detalji o record-ima se mogu pogledati ovde

Init-only setters

Prilikom definisanja record-a u sekciji iznad, umesto ključne reči set korišćena je init, koja omogućava inicijalizaciju propertija, ali ne i njegovo kasnije menjanje.


Top-level statements

Gledajući code snippet, otvara se pitanje - gde nestade Main metoda? 🤔 Tehnički, ona je sakrivena, s tim što kompajler “magično” generiše Main metodu i klasu prilikom kompajliranja i time otklanja šablonski (boilerplate) kod.

Entity Framework Core 5

Many-to-many

U prethodnim verzijama, za many-to-many relaciju je bilo potrebno kreiranje dodatne klase koja ce sadržati navigacione propertije, tj. strane ključeve tabela koje se join-uju. Počev od ove vezije, potrebno je samo definisati kolekcijske navigacione propertije u entitetima: 

Split queries

Od verzije 3, Entity Framework Core je generisao raw SQL za svaki LINQ upit i ako sadrži jedan ili vise join-a može doći do “Cartesian Explosion”:

Ovaj problem je u EF Core 5 rešen Split Query opcijom koja deli SQL upit na više manjih (svaki join je poseban upit):

Ostale novine za EF Core 5 se mogu pronaći ovde

Tehnologije koje više nemaju podršku

Težnja petice da bude potpuno cross-platform framework, dovela je do uklanjanja nekih tehnologija koje su podržavane u .NET Framework-u, a to su:

  • Web Forms 
  • Windows Communication Foundation (WCF) 
  • Windows Workflow Foundation (WWF)

Š'A IMA NOVO U .NET 6?

Završena unifikacija

Ovom verzijom, Microsoft je završio unifikaciju i time obezbedio univerzalnu platformu za razvoj aplikacija - za bilo koji uređaj, na bilo kojoj platformi. Novi, jedinstveni .NET (performantiji u odnosu na svog prethodnika) ima zajedničke API-eve koji sada omogućavaju kreiranje i mobilnih, web, desktop, gaming, cloud, IoT i ostalih aplikacija, bez dodatnih instalacija, kako je to bio slučaj u prethodnim verzijama (Xamarin za mobile development, .NET Core za cross-platform web development).

Šestica je inače LTS (Long Term Support) release. Neophodno je instalirati Visual Studio 2022 za njeno korišćenje.

Hot Reload

Možda i jedan od naj🔥 dodataka u ovoj verziji - nakon snimanja promena u kodu, promene se automatski reflektuju na UI, bez ponovnog build-ovanja ili restartovanja aplikacije:

Hot reload jos uvek ne podrzava sve promene, ali se ovde mogu pronaći detalji o podržanim platformama i scenarijima. Zbogom ponovnom rebuild-ovanju projekta na svaku UI promenu, dobar dan na Hot Reload! 🔥 

.NET MAUI

Glavni “krivac” zbog kog je unifikacija platforme završena tek u ovoj verziji dobija GA verziju. Ime je skraćenica od .NET Multi-platform App UI, a u pitanju je cross-platform tehnologija za kreiranje mobilnih (Android, iOS) i desktop (Windows, Mac) aplikacija na osnovu jednog, deljenog codebase-a.

Veći broj .NET MAUI funkcionalnosti se oslanja na one iz Xamarin.Forms-a (samim tim prelazak neće biti težak 🙂), s tim što je unifikacija platforme “nametnula” potpuni rewrite kontrola, što je osim extend-ovanja istih donelo i još mnogo benefita.

Minimal API

Kreiranje potpuno funkcionalnog REST API-a u 3 linije koda, moguće je od ove verzije, uz pomoć Minimal API-a:

Prilikom kreiranja API-a na tradicionalni način (controller-based), bio je potreban Program.cs fajl (koji je bio ulazna tačka u aplikaciju i sadržao application-wide konfiguraciju), Startup.cs fajl (za konfiguraciju API-a) i bar jedna kontrolerska klasa (koja bi sadržala API endpoint-e). Sa minimal API-em, sva magija se dešava u Program.cs fajlu 😎.

U .NET 6-ici je ovo default template za kreiranje web aplikacija, a ovde su ostali promenjeni template-i. Btw, ako si kojim slučajem nostalgičar i navik’o si na Program.cs/Startup.cs duo, postoji mogućnost da se to vrati. 

LINQ improvements

Ni LINQ nije ostao uskraćen novina, a neke od njih su:  

TryGetNonEnumeratedCount

U prethodnim verzijama je Count metoda služila da izvuče vrednost iz Count atributa (ako postoji); u suprotnom pokreće enumeraciju radi dobijanja broja elemenata u kolekciji, što za neke veće kolekcije i nije baš performantno. TryGetNonEnumeratedCount rešava taj problem tako sto vraća true ako broj elemenata postoji i u out promenljivoj vraća vrednost Count propertija; u suprotnom neće odraditi ništa.

Chunk

Deli kolekciju po zadatoj dužini na manje kolekcije:

MinBy, MaxBy, DistinctBy, ExceptBy, IntersectBy i UnionBy

Od ove verzije je za navedene metode ubačena podrška da, po zadatom ključu, vraćaju element iz kolekcije (ceo objekat).

C# 10

Nova, deseta verzija C#-a je donela par finih novosti (za kompletan pregled, pravac ovde). 

Global using directives

Namespaces, koje je bilo potrebno definisati u svakom fajlu i koji su u 99% slučajeva bili zajednički za X fajlova, sada se mogu definisati globalno, na jednom mestu u aplikaciji i biti dostupni za ceo projekat - sve što je potrebno je da svaki using ima prefiks global.

File-scoped namespaces

Preterano uvlačenje/ugnježdavanje koda ume da dovede do loše čitljivosti (ekstremni primer ovoga je poznat kao “Pyramid of Doom”). C# 10 ovaj problem čini bar malo podnošljivijim, zahvaljujući file-scoped namespace-ovima. Ovo omogućava čistije deklarisanje klasa, metoda i ostalih stvari ispod jednog namespace-a, bez dodatnih vitičastih zagrada i uvlačenja - jednostavno, sve što je deklarisano ispod navedenog namespace-a, smatraće se da mu i pripada.

FILE-SCOPED NAMESPACES

SQL temporal tables

U SQL-u uloga temporalnih tabela je da čuvaju istoriju promene podataka za određenu tabelu. Microsoft je u SQL Server 2016 predstavio podršku za ove tabele, a od EF Core 6 je moguće i njihovo kreiranje. Takođe, pored kreiranja, postojeće tabele se mogu prebaciti u temporalne, pomoću migracija.

Migration bundle

Omogućava kreiranje exe fajla, koji sadrži potrebna podešavanja za izvršavanje prethodno kreiranih migracija. Migration bundle-ovi su pogodni za DevOps scenarija, ili kad je izvršavanje migracija iz koda ili putem CLI-a rizično. Ostale novine za EF Core 6 se mogu pronaći ovde

I ŠTA ĆEMO SAD?

Ako si došao dovde - alal vera, a sad nagradi sebe nečim slatkim, da povratiš malo kalorije nakon ovog mentalnog napora 😜. 

Nadam se da sam ti bar malo pomogao u upoznavanju sa cool new features, koje možda i nećeš moći da koristiš u svakodnevnom radu još neko vreme, jer si zaglavljen na nekoj staroj verziji .NET-a 😅.

S druge strane, nadam se da ti je ovaj tekst bar malo ublažio FOMO oko novina koje su donele navedene verzije. Ako jeste, onda budi dobar čo’ek i prenesi to dalje svojim kolegama/prijateljima/braći/kumovima (npr. share-ovanjem ovog blog posta 😊).

A ti? Na kojoj verziji .NET-a primarno radiš? Kol’ko te mnogo puca FOMO od nekorišćenja novih verzija? Koje su tvoje omiljene novosti iz petice i šestice? Jel’ sam propustio da pomenem neku kul novu foru? Javi se u komentarima i podeli utiske🙏. A usput i slobodno čekiraj otvorene pozicije i prakse koje imamo u Ingu 🤓. Profil kompanije možeš pogledati ovde.

Galerija