Ich habe diesen Code (der gesamte Code ist nicht wichtig, sondern kann auf this link zu sehen):Warum erstellt C# -Compiler private DisplayClass bei Verwendung der LINQ-Methode Any() und wie kann ich es vermeiden?
internal static class PlayCardActionValidator
{
public static bool CanPlayCard(...)
{
// ...
var hasBigger =
playerCards.Any(
c => c.Suit == otherPlayerCard.Suit
&& c.GetValue() > otherPlayerCard.GetValue());
// ...
}
}
Nachdem Sie den Code in Decompiler (ILSpy) Öffnen zum Beispiel ich die Existenz bemerkt neu <>c__DisplayClass0_0
durch die erstellte Klasse C# Compiler:
Dies wäre kein Problem für mich, wenn dieser Code für die Leistung des Systems nicht entscheidend ist. Diese Methode wird millionenfach und der Garbage Collector ist die Reinigung dieser <>c__DisplayClass0_0
Instanzen genannt, die auf der Leistung verlangsamt:
Wie kann ich diese Klasse vermeiden zu schaffen (seine Instanzen und ihre Mülleinsammlungs), wenn die Verwendung von Any
Methode?
Warum erstellt der C# -Compiler diese Klasse und gibt es eine Alternative Any()
kann ich verwenden?
Es muss den Code neu zu schreiben, ein sicheres Zuhause für die erfassten Variablen, otherPlayerCard zu finden und TrumpCard hier. Wenn Sie sie von lokalen Variablen in Felder umwandeln, kann deren Wert über den Methodenkörper hinaus erhalten bleiben. DisplayClass ist das sichere Zuhause. –
Verwenden Sie nicht LINQ auf heißen Pfaden, das ist die Richtlinie für die Roslyn-Codebasis. – DaveShaw
Normalerweise würde ich Micro-Optimierungen nicht empfehlen, aber wenn dieser Code ** Millionen ** mal ausgeführt wird, wäre das Refactoring, um es für die Geschwindigkeit zu optimieren, die Lösung hier. LINQ ist langsam. –