Why does C# compiler create private DisplayClass when using LINQ method Any() and how can I avoid it?

前端 未结 2 1691
耶瑟儿~
耶瑟儿~ 2020-12-28 13:31

I have this code (the whole code is not important but can be seen on this link):

internal static class PlayCardActionValidator
{
    public static bool CanPl         


        
2条回答
  •  别那么骄傲
    2020-12-28 14:36

    To understand the "display class" you have to understand closures. The lambda you pass here is a closure, a special type of method that magically drags in state from the scope of the method it's in and "closes around" it.

    ...except of course that there's no such thing as magic. All that state has to actually live somewhere real, somewhere that's associated with the closure method and readily available from it. And what do you call the programming pattern where you associate state directly with one or more methods?

    That's right: classes. The compiler transforms the lambda into a closure class, then instantiates the class inside the hosting method so the hosting method can access the state in the class.

    The only way to not have this happen is to not use closures. If this is really impacting performance, use an old-school FOR loop instead of a LINQ expression.

提交回复
热议问题