Ho questo codice (tutto il codice non è importante, ma può essere visto su this link):Perché il compilatore C# crea DisplayClass privato quando si utilizza il metodo LINQ Qualsiasi() e come posso evitarlo?
internal static class PlayCardActionValidator
{
public static bool CanPlayCard(...)
{
// ...
var hasBigger =
playerCards.Any(
c => c.Suit == otherPlayerCard.Suit
&& c.GetValue() > otherPlayerCard.GetValue());
// ...
}
}
Dopo aver aperto il codice a decompilatore (ILSpy) per esempio ho notato l'esistenza di classe appena creata <>c__DisplayClass0_0
dal compilatore C#:
questo non sarebbe un problema per me se questo codice non è stato fondamentale per le prestazioni del sistema. Questo metodo viene chiamato milioni di volte e il garbage collector sta pulendo questi <>c__DisplayClass0_0
casi che rallenta le prestazioni:
Come posso evitare di creare questa classe (i suoi casi e la loro raccolta spazzatura) quando si utilizza il Metodo Any
?
Perché il compilatore C# crea questa classe e c'è un'alternativa di Any()
che posso usare?
Ha bisogno di riscrivere il codice per trovare una casa sicura per le variabili catturati, otherPlayerCard e TrumpCard qui. Trasformandoli da variabili locali in campi in modo che il loro valore possa essere preservato oltre il corpo del metodo. DisplayClass è quella casa sicura. –
Non utilizzare LINQ su percorsi caldi, questo è il criterio sulla base di codice di Roslyn. – DaveShaw
Normalmente evito di raccomandare micro-ottimizzazioni, ma se questo codice viene eseguito ** milioni ** di volte, refactoring di questo per ottimizzarlo per la velocità sarebbe la soluzione qui. LINQ è lento. –