Diskuze: C# Func and Action
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Třeba toto:
namespace System.Linq
{
public static class EnumerableEx
{
internal static IEnumerable<T>
LateInit<T>(Func<IEnumerable<T>> initFunc)
{
return new LateInitEnumerable<T>(initFunc);
}
}
class LateInitEnumerable<T> : IEnumerable<T>
{
Func<IEnumerable<T>> _initFunc;
internal LateInitEnumerable(Func<IEnumerable<T>> initFunc)
{
_initFunc = initFunc;
}
IEnumerable<T> _source;
bool _sourceTaken;
public IEnumerator<T> GetEnumerator()
{
if (!_sourceTaken)
{
_sourceTaken = true;
_source = _initFunc();
}
return _source.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
}
Mějme methodu ProcessData(IEnumerable<Value> data).
Pokud zavolám ProcessData(Db.GetData()), data se z DB získají okamžitě a
jsou poslány do methody.
Pokud ovšem existuje možnost, že data nebudou v method zpracovávána,
zavolám ji ProcessData(EnumerableEx
.LateInit( ( ) => Db.GetData())) a data budou načtena až při jejich
enumeraci.
Omlouvám se za formátování, nevím, zda to lze prezentovat nějak rozumně.
Druhé tlačítko zleva je "</>" ==> "vložit zdrojový kód".
Tohle už za tebe ale dělá deffered execution lol.
Nejčastěji to uvidíš v LINQu, který umí dělat projekce, selekce, ... Praktická ukázka je třeba
Lazy<T>(Func<T>)
Máš náročný zdroj, který ne vždycky potřebuješ, tak tomu jen předáš delegáta jakým způsobem se má vytvořit (simuluje to factory method pattern s využitím lazy load). A pak samozřejmě události samotné. Je dobrá chápat rozdíl mezi delegátem a eventem.
Zobrazeno 5 zpráv z 5.