mam ten kod (cały kod nie jest ważna, ale widać na this link):Dlaczego kompilator C# tworzy prywatną DisplayClass przy użyciu metody LINQ Any() i jak mogę tego uniknąć?
internal static class PlayCardActionValidator
{
public static bool CanPlayCard(...)
{
// ...
var hasBigger =
playerCards.Any(
c => c.Suit == otherPlayerCard.Suit
&& c.GetValue() > otherPlayerCard.GetValue());
// ...
}
}
Po otwarciu kod w Decompiler (ILSpy) na przykład zauważyłem istnienie nowo utworzonej klasie <>c__DisplayClass0_0
przez kompilator C#:
nie byłoby to dla mnie problemem, jeśli ten kod nie było krytyczne dla funkcjonowania systemu. Metoda ta nazywana jest miliony razy i garbage collector jest czyszczenie tych <>c__DisplayClass0_0
instancji, który spowalnia wydajność:
Jak mogę uniknąć tworzenia tej klasy (jego wystąpień i ich śmieci zbieranie) przy użyciu Any
metoda?
Dlaczego kompilator C# tworzy tę klasę i czy istnieje alternatywa dla Any()
, której mogę użyć?
Trzeba przepisać kod znaleźć bezpieczny dom dla przechwyconych zmiennych, otherPlayerCard i trumpCard tutaj. Przekształcanie ich ze zmiennych lokalnych w pola, aby ich wartość mogła być zachowana poza treścią metody. DisplayClass to bezpieczny dom. –
Nie używaj LINQ na gorących ścieżkach, to zasady dla kodu Roslyn. – DaveShaw
Zazwyczaj unikałbym zalecania mikro-optymalizacji, ale jeśli ten kod jest uruchamiany ** miliony ** razy, rozwiązaniem byłoby tutaj refaktoryzacja w celu zoptymalizowania prędkości. LINQ jest powolny. –