У меня есть этот код (весь код не важен, но можно увидеть на this link):Почему компилятор C# создает частный DisplayClass при использовании метода LINQ Any() и как его избежать?
internal static class PlayCardActionValidator
{
public static bool CanPlayCard(...)
{
// ...
var hasBigger =
playerCards.Any(
c => c.Suit == otherPlayerCard.Suit
&& c.GetValue() > otherPlayerCard.GetValue());
// ...
}
}
После открытия кода в Decompiler (ILSpy), например, я обратил внимание на существование вновь созданного класса <>c__DisplayClass0_0
по C# компилятор:
Это не будет проблемой для меня, если этот код не был критическим для работы системы. Этот метод называется миллионы раз, и сборщик мусора очистки этих <>c__DisplayClass0_0
экземпляров, которые замедляют производительность:
Как я могу избежать создания этого класса (его экземпляры и их мусорный сбор) при использовании Any
способ?
Почему компилятор C# создает этот класс и есть ли альтернатива Any()
Я могу использовать?
Необходимо переписать код, чтобы найти безопасный дом для захваченных переменных, otherPlayerCard и trumpCard здесь. Превращение их из локальных переменных в поля, чтобы их значение можно было сохранить за пределами тела метода. DisplayClass - это безопасный дом. –
Не используйте LINQ для горячих путей, это политика на основе кода Roslyn. – DaveShaw
Я бы обычно избегал рекомендовать микро-оптимизации, но если этот код запускается ** миллионы ** раз, рефакторинг этого для оптимизации его для скорости будет решением здесь. LINQ медленный. –