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.