this dir | view | cards | source | edit | dark top

Pokročilé programování v C#

Pokročilé programování v C#
Základní typování

typové konverze

Základní typování

extension methods

Základní typování

method overloading

Generiky

mohli bychom mít object Max(object, object)?

Generiky

T Max<T>(T a, T b) { … }

Generiky

v C++

Generiky

generická metoda zůstává generickou na úrovni CIL kódu

tudíž CIL kód musí být dostatečně obecný – k tomu se dostaneme později

Generiky

důležitá myšlenka – překladač si může vhodnou specializaci zvolit sám

Generiky

generická metoda se dá kombinovat s konkrétními overloady

Generiky

situace – mám generickou metodu, která volá generickou metodu s konkrétními overloady

Generiky

připomenutí

Generiky

v CIL kódu je zapsáno, jaká metoda se volá

Generiky

ve složitější typové hierarchii

Generiky

co můžeme dělat uvnitř generické metody s parametrem typu T?

můžeme volat metody objectu

Generiky

připomenutí

Generiky

v C# se taky dá používat pythonovský duck-typing

Generiky

u generických metod použijeme interfaces, abychom mohli volat něco jiného než metody objectu

Generiky

metoda s interfacovým parametrem vs. generická metoda s constraintem na daný interface

Generiky

další použití

Generiky

dědičnost

Generiky

v generické třídě můžou být metody…

Generiky

u constraints se dá použít čárka, ta znamená AND

OR by nemělo smysl

Generiky

interfaces

Generiky

explicitní implementace metody z interfacu

Generiky

generické typy v kombinaci s interfaces

Generiky

implementace generických interfaces

Generiky

this

Generiky

nová funkce C# – statické abstraktní metody v interfacech

Generiky

speciální constrainty

Generiky

pojmy

Generiky

každý zápis do každého pole referenčních typů vede na runtime check

Generiky

kovariance

Generiky

kontravariance

Generiky

od C# 9 jsou virtuální metody kovariantní dle návratové hodnoty

Generiky

kovariance u polí

Generiky

specializace Listu jsou invariantní

takže do parametru typu List<object> nemůžeme předat List<Person>

Generiky

parametr List<object> je zbytečně specifický, stačí nám vlastnost Count a možnost indexace

Generiky

generické interfacy u referenčních typů jsou volitelně variantní

Generiky

máme List stringů, chceme ho přiřadit do IList<object>, to nejde

Generiky

obecně se dá castovat typ do interfacu, který neimplementuje, jen se provádí runtime check, jestli konkrétní objekt (jeho typ) implementuje daný interface

Generiky

interface IComparer<in T>

Generiky

kovarianci použijeme, když budeme chtít mít pro zvíře jeden logger

pro vlka chceme mít speciální logger uložený ve stejné proměnné

Kolekce

interfacy kolekcí

Kolekce

namespaces (jmenné prostory)

Kolekce

nested types (vnořené typy)

Kolekce

IEnumerable<T>

Kolekce

jak pracovat s IList?

Kolekce

programujeme enumerátor

Kolekce

neplatná volání Current jsou v rozporu s typickým kontraktem enumerátoru

Kolekce

lokální proměnné z našeho kódu budou uloženy jako fieldy enumerátoru

Kolekce

pokud je iterátorová metoda instanční metoda nějakého objektu, tak v ní můžu použít vlastnosti toho objektu (protože má implicitní parametr this)

pak se musí this nakopírovat (capture by value) dovnitř enumerátoru

Kolekce

náš kód se přeloží do stavového automatu (metoda MoveNext funguje jako stavový automat)

Kolekce

enumerátor podporuje lazy evaluation

iterátorové metody taky – s každým voláním MoveNext se provede jenom jeden krok

Kolekce

chci IEnumerable převést na List

Kolekce

LinkedList

Kolekce

iterátorové metody

Kolekce

v C++ 20 jsou taky iterátorové metody

Reflection

proces překladu

Reflection

typ Type

když zavoláme typeof(A), kde A je typ, nebo x.GetType(), kde x je proměnná

Reflection

typ Assembly

Reflection

na typu Type existuje spousta užitečných metod, které vrací instance potomků abstraktní třídy MemberInfo

Reflection

co s tím?

Delegáti

motivační příklad

Delegáti

delegate

Delegáti

delegáti a viditelnost

Delegáti

delegáti můžou ukazovat i na instanční metody

Delegáti

delegáti můžou být generičtí

můžou být kovariantní a kontravariantní – viz ET přednáška

Delegáti

občas mi jde čistě o parametry – je mi úplně jedno, co ten delegát dělá

Delegáti

var funguje i pro delegáty

Delegáti

efektivita delegátů

Delegáti

JSON serializer

Delegáti

coroutine

Delegáti

zpátky s motivačnímu příkladu

Delegáti

napíšeme static, pak do závorky parametry, pak šipku => a potom tělo funkce

dá se přímo zapsat jako parametr metody FindIndex

Delegáti

proč je tam klíčové slovo static?

označuje, že lambda funkce nemá stav

Delegáti

ekvivalentní příklady lambda funkcí

Delegáti

lambda funkce nejsou first-class entities – neexistuje proměnná typu „lambda funkce“

jsou přiřaditelné do proměnných typu delegát (a ještě někam jinam – viz ET přednáška)

Delegáti

může se stát, že voláme generickou metodu a předáváme ji jako parametr lambda funkci, takže překladač musí řešit trochu složitější rovnici

když to nevede na jednoznačné řešení, tak je to překladová chyba

Delegáti

když tam to static nedáme, tak se zapíná nějaká speciální funkce, ale pokud ji nepoužíváme, tak je to jedno

to static tam píšeme jenom proto, abychom tu speciální fíčuru nepoužili omylem

Delegáti

kde lambda funkce použít?

Delegáti

v C# je LINQ pouze syntaxe, nedefinuje to žádnou sémantiku

zatímco SQL dotazy mají i sémantiku

Delegáti

syntax LINQ dotazů

Delegáti

fakt tam není sémantika

můžu mít metodu OrderBy, která zabíjí příšery a vrací počet těch, které jsme zabili

Delegáti

v C# je definován základní LINQ to Objects

Delegáti

lambda funkci si můžeme představit jako funkci, která žije v nějakém kontextu

Delegáti

potřebovali bychom nějakým trikem dostat do lambda funkce přiřazené hodnoty těch volných proměnných

Delegáti

metoda .ForEach(Action<T>)

respektive Array.ForEach(T[], Action<T>) pro pole

Delegáti

scope

Vícevláknové programování

proces v C#

Vícevláknové programování

chceme provést dva algoritmy (A a B)

Vícevláknové programování

proč bychom to vůbec chtěli

Vícevláknové programování

třída Thread

Vícevláknové programování

context switch

Vícevláknové programování

stav vlákna

Vícevláknové programování

datové struktury, které vlákno používá, nejsou celou dobu v konzistentním stavu

Vícevláknové programování

problémy

Vícevláknové programování

v dotnetu je třída ThreadPool

Vícevláknové programování

příklad s hamburgery

Vícevláknové programování

v dotnetu koncept future reprezentovaný třídou Task<T>

Vícevláknové programování

Task<T> je potomek třídy Task

Task si můžeme představit jako Task<void> – i to je užitečné (příklad s traktoristou, který orá pole, chceme zjistit, jestli má hotovo)

Vícevláknové programování

jak paralelizovat sčítání výsledků dvou drahých metod

Vícevláknové programování

jak získat Task<T>

Vícevláknové programování

defaultování futures (když slib nedokážu naplnit)

Vícevláknové programování

co se stane, když se z delegáta v threadpoolu vyšíří výjimka

Vícevláknové programování

struktura CancellationToken

Vícevláknové programování

část, kdy nějaké vlákno pracuje se sdílenou datovou strukturou = kritická sekce

Vícevláknové programování

v dotnetu – syncblock

Vícevláknové programování

lock (zámek)

Vícevláknové programování

asynchronní metoda (vol. 1)

Vícevláknové programování

někdy by se nám hodilo něco, co by zahrnovalo dohromady future i promise

Vícevláknové programování

chci znát aktuální Task

Vícevláknové programování

Task.Run(úloha)

Vícevláknové programování

příklad s velkými a malými úlohami v thread poolu

Vícevláknové programování

lokální metody

Vícevláknové programování

cíl: napsat kód ve formátu „něco rychlého, něco pomalého, něco rychlého, něco pomalého, něco rychlého, …“, který se bude vykonávat postupně, ale nebude blokovat vlákno

Vícevláknové programování

async

Vícevláknové programování

pozor na šíření výjimek

Vícevláknové programování

pozor na kombinaci zámku a awaitů

Vícevláknové programování

semafor – má dvě implementace

Vícevláknové programování

další synchronizační primitiva

Vícevláknové programování

promise, future

Vícevláknové programování

ilustrace použití – problém producent/konzument (producer/consumer)

Vícevláknové programování

situace – funkce si chtějí mezi sebou předávat informaci, když běží ve stejném vlákně

Vícevláknové programování

různé frameworky definují threading model

Hurá, máš hotovo! 🎉
Pokud ti moje kartičky pomohly, můžeš mi koupit pivo.