Ecco un esempio di una proprietà che ho, codificato nel modo più semplice possibilestruttura pigro richiedendo "questa"
private IEnumerable<int> _blocks;
private bool _blocksEvaluated;
public IEnumerable<int> Blocks
{
get
{
if (!_blocksEvaluated)
{
_blocksEvaluated = true;
_blocks = this.CalculateBlocks(0).FirstOrDefault();
}
return _blocks;
}
}
Questo è dettagliato; Mi piacerebbe renderlo più conciso se possibile. Il seguente sarebbe accettabile ...
private Lazy<IEnumerable<int>> _blocks =
new Lazy<IEnumerable<int>>(() => this.CalculateBlocks(0).FirstOrDefault());
... ma non viene compilato.
chiave di 'questo' non è valido per una proprietà statica, metodo statico, o campo statico inizializzatore
Così mi si avvicinò con la seguente
struct MyLazy<TResult>
{
private bool evaluated;
private TResult result;
public TResult Evaluate(Func<TResult> func)
{
if (!evaluated)
{
evaluated = true;
result = func();
}
return result;
}
}
private MyLazy<IEnumerable<int>> _blocks;
public IEnumerable<int> Blocks
{
get { return _blocks.Evaluate(() => this.CalculateBlocks(0).FirstOrDefault()); }
}
Quale mi piace di più, ma c'è un modo migliore?
Nota: mi rendo conto che le strutture mutabili sono solitamente malvagie, ma sembrano davvero utili per questo particolare problema.
posso chiedere perché è numeroso quando sembri assegnarlo solo 1 singolo valore? – terrybozzio
'CalculateBlocks' restituisce un' IEnumerable> ' –