C # рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝ рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЯреНрд░реА рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдмрдирд╛рдо рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди) рдЦреЛрдЬрдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░

рдЕрдЪреНрдЫрд╛ рджрд┐рдиред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рднреНрд░рд╛рдордХ рд╡рд┐рд╖рдп рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╡рд┐рд╡рд┐рдз рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА, рдЙрддрдиреЗ рд╣реА рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реЛрдВрдЧреЗ, рдЬреЛ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рдЬреЛ рдЙрдирдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╣реЛред



рд▓реЗрдЦ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рд╡реИрдЪрд╛рд░рд┐рдХ рдврд╛рдВрдЪреЗ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдиреАрдЪреЗ рджреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛ред

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╡реГрдХреНрд╖реЛрдВ
рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ
рдкреНрд░рдХрд╛рд░ рдХреЗ
рдкреИрдЯрд░реНрди рдХрд╛ рдорд┐рд▓рд╛рди
рднреЛрд▓реЗ рдЖрдЧрдВрддреБрдХ
рдХреНрд▓рд╛рд╕рд┐рдХ рд╡рд┐рдЬрд╝рд┐рдЯрд░

рдЦреИрд░, рд▓рдХреНрд╖реНрдп рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рд▓рдЧрд╛рдиреЗ рдпрд╛ рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдореИрдВ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рднреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдЦреБрдж рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЕрдкрдиреА рд░рд╛рдп рд╡реНрдпрдХреНрдд рдХрд░реВрдВрдЧрд╛ред


рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝


рдореВрд▓ рдмрд╛рддреЗрдВ


рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдирдХрд╛ рдорддрд▓рдм рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдпрд╛ рдЙрд╕рдХреЗ рдХрд┐рд╕реА рд╡рд╛рд░рд┐рд╕ рд╕реЗ рд╣реИ (рдмрд╛рдж рдореЗрдВ рдЙрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА)ред рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ / рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб / рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд)ред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ / рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рдЖрдорддреМрд░ рдкрд░ рд▓реИрдореНрдмреНрдбрд╛, рд▓реЗрдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкреЗрдбрд╝ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЖрдпреЛрдЬрд┐рдд рдбреЗрдЯрд╛ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣реБрдВрдЪ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рдХрдХреНрд╖рд╛ рдХреЗ рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдпреЛрдЬрди рдХрд╛ рдкреЗрдбрд╝ рдЬреИрд╕рд╛ рддрд░реАрдХрд╛ рд╣рдореЗрдВ "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝" рджреЗрддрд╛ рд╣реИред

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реИрдореНрдмреНрдбрд╛

(x) => Console.WriteLine (x + 5)

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


рдЯреНрд░реА рдХреА рдЬрдбрд╝ рдореЗрдердбрдХреЙрд▓ рдореЗрдВ рд╕рдмрд╕реЗ рдКрдкрд░ рд╣реИ , рд╡рд┐рдзрд┐ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрдЪреНрдЪреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╡рдВрд╢рдЬ рд╣реИ - " рдЕрд░рд┐рдердореЗрдЯрд┐рдХреЛрдкрд░реЗрд╢рди " рдХрд╛ рд╢рд┐рдЦрд░ ред рдЗрд╕рдореЗрдВ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ рдФрд░ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдСрдкрд░реЗрдВрдб рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╢реАрд░реНрд╖ рдкрд░ рд╣рдореЗрд╢рд╛ 2 рд╡рдВрд╢рдЬ рд╣реЛрдВрдЧреЗред

рдСрдкрд░реЗрдВрдб рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ ( рдирд┐рд░рдВрддрд░ ) рдФрд░ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ ( рдкреИрд░рд╛рдореАрдЯрд░ ) рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдРрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдХреЛрдИ рд╡рдВрд╢рдЬ рдирд╣реАрдВ рд╣реИред

рдпреЗ рдмрд╣реБрдд рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝реЛрдВ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝реЗрдВред рдХреБрдЫ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╡рд┐рд╡рд░рдг рдХрд╛ рдПрдХ рд╕рд╛рдзрди рд╣реИрдВ (рдмрд╣реБрдд рд╕рд╢рд░реНрдд, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ)ред рдЬрдмрдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдбреЗрдЯрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди / рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдХрд╛рдИ рдврд╛рдВрдЪреЗ рдХреЗ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЖрд╡реЗрджрди рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕ рд╡рд┐рд╡рд░рдг рд╕реЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред рдХрдо рдкреНрд░рд╕рд┐рджреНрдз рдЙрджрд╛рд╣рд░рдг рдореЛрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП moq рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ ред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡реГрдХреНрд╖реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ DLR рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред(рдбрд╛рдпрдиреЗрдорд┐рдХ рднрд╛рд╖рд╛ рд░рдирдЯрд╛рдЗрдо)ред рдХрдВрдкрд╛рдЗрд▓рд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдПрдордПрд╕рдЖрдИрдПрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХреГрддрд┐ рдФрд░ рдбреЙрдЯрдиреЗрдЯ рдХреЗ рдмреАрдЪ рд╕рдВрдЧрддрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред

рдпрд╣ рднреА рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред

рд╡рд╛рдХреНрдп - рд╡рд┐рдиреНрдпрд╛рд╕


рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд╛рдпрдХ рдЕрдЧрд▓реА рдмрд╛рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИред 2 рдореБрдЦреНрдп рддрд░реАрдХреЗ рд╣реИрдВ:

  • рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд░реНрдЧ рдХреЗ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝ рдмрдирд╛рдирд╛
  • рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрдХреНрд╖рд╛ рдХреЗ рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЗ


рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд░реНрдЧ рдХреЗ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝ рдмрдирд╛рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдХрдо рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ)ред рдпрд╣ рдмреЛрдЭрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ
рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдмреБрдирд┐рдпрд╛рджреА рдИрдВрдЯреЗрдВ рд╣реИрдВ, рдЬрд┐рдирд╕реЗ рдЖрдк рдХрд╛рдлреА рдЬрдЯрд┐рд▓
рдЪреАрдЬреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рд░реНрдорд╛рдг рддрдм рд╕реЗ рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд╢реЛрдзрдХ рд╣реЛрддрд╛ рд╣реИ ред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрдирд╛рдКрдВрдЧрд╛ :

(x) => Console.WriteLine (x + 5)

ParameterExpression parameter = Expression.Parameter(typeof(double));
ConstantExpression constant = Expression.Constant(5d, typeof(double));
BinaryExpression add = Expression.Add(parameter, constant);
MethodInfo writeLine = typeof(Console).GetMethod(nameof(Console.WriteLine), new[] { typeof(double) });
MethodCallExpression methodCall = Expression.Call(null, writeLine, add);
Expression<Action<double>> expressionlambda = Expression.Lambda<Action<double>>(methodCall, parameter);
Action<double> delegateLambda = expressionlambda.Compile();
delegateLambda(123321);

рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝реЛрдВ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдпрд╣ рд╡рд┐рдзрд┐ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рдЬреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ: рдЫреЛрд░реЛрдВ, рд╕реНрдерд┐рддрд┐рдпреЛрдВ, рдЯреНрд░рд╛рдЗ-рдХреИрдЪ, рдЧреЛрдЯреЛ, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ, рдлреЙрд▓реНрдЯ рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ, рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА, рдбрд╛рдпрдирд╛рдорд┐рдХ рдЖрджрд┐ред

рд▓реИрдВрдмрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐


рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдВрдмреЛрджрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд▓рдЧрд╛рддрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕реНрдорд╛рд░реНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ рд▓реИрдореНрдмреНрдбрд╛ рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ рдпрд╛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рд╕реНрдЯрд░ рдЙрджрд╛рд╣рд░рдг рдкрд░, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИ

Expression<Action<double>> write =  => Console.WriteLine( + 5);

рдпрд╣ рдРрд╕реА рдмрд╛рдд рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рд╣реИред рдФрд░ рдпрд╣
рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ ред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдЬреИрд╕реЗ рд▓реИрдВрдмрдбрд╛рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдпрд╛ рдЙрд╕рдХреЗ рд╡рдВрд╢рдЬ
рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдЖрдИрдПрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ред рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реАрдзреЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдмрд╣реБрдд рдЕрд░реНрде рдирд╣реАрдВ рд╣реИ)ред
рд╡реИрд╕реЗ, рдЕрдЧрд░ рдХреЛрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рддреЗрдЬ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рдЖрдк рдЗрд╕ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ ред

рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗрд╡рд▓ рдЗрд╕реЗ рдирд╣реАрдВ рдЙрдард╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреБрдж рдХреЛ рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИ)ред

рд╕рднреА рдореЗрдордиреЛрдВ рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ:

  • рдпреБрдХреНрдд рдХрд╛рд░реНрдп рд╕рдВрдЪрд╛рд▓рдХ
  • рдЧрддрд┐рд╢реАрд▓ рдпреЛрдЧрджрд╛рди
  • рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ
  • рд╢рд░реАрд░ (рдмреНрд░реЗрд╕рд┐рдЬрд╝) рдХреЗ рд╕рд╛рде

double variable;
dynamic dynamic;
Expression<Action> assignment = () => variable = 5; //Compiler error: An expression tree may not contain an assignment operator
Expression<Func<double>> dynamically = () => dynamic; //Compiler error: An expression tree may not contain a dynamic operation
Expression<Func<Task>> asynchon = async () => await Task.CompletedTask; //Compiler error: Async lambda cannot be converted to expresiion trees
Expression<Action> body = () => { }; //Compiler error: A lambda expression with a statement body cannot be converted to an expression tree


рднрд╛рд╡ рдХреЗ рдкреНрд░рдХрд╛рд░


рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рдЕрд╡рд╕рд░ рд╣реИрдВ, рдЙрдирдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рд╡реЗ рд╕рднреА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╣реИрдВ

ред рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рднрд╛рд╡реЛрдВ рдХреЛ рдореИрдВрдиреЗ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЯреИрдмрд▓реЗрдЯ рдореЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ред

рдЧрддрд┐рд╢реАрд▓


рдбрд╛рдпрдирд╛рдорд┐рдХрдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝реЛрдВ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдФрд░ рдЗрд╕рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдПрдХ рдмрд▓реНрдХрд┐ рднреНрд░рд╛рдордХ рдПрдкреАрдЖрдИ рд╣реИ, рдореИрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╕рдВрдпреБрдХреНрдд рдЕрдиреНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдмреИрдард╛ рд░рд╣рд╛ред рд╕рднреА рднреНрд░рдо рд╡рд┐рднрд┐рдиреНрди рдЭрдВрдбреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЖрдк рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИрдВред рдФрд░ рдЬрдм рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝реЛрдВ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЯреЙрдХрд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг:

var parameter1 = Expression.Parameter(typeof(object), "name1");
var parameter2 = Expression.Parameter(typeof(object), "name2"); 
var dynamicParam1 = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null);
var dynamicParam2 = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null);
CallSiteBinder csb = Microsoft.CSharp.RuntimeBinder.Binder.BinaryOperation(CSharpBinderFlags.None, ExpressionType.Add, typeof(Program), new[] { dynamicParam1, dynamicParam2 });
var dyno = Expression.Dynamic(csb, typeof(object), parameter1, parameter2);
Expression<Func<dynamic, dynamic, dynamic>> expr = Expression.Lambda<Func<dynamic, dynamic, dynamic>>(dyno, new[] { parameter1, parameter2 });
Func<dynamic, dynamic, dynamic> action = expr.Compile();
var res = action("1", "2");
Console.WriteLine(res); //12
res = action(1, 2);
Console.WriteLine(res); //3

рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдмрд╛рдЗрдВрдбрд░ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдВрдбрд░ рдХреЗ рд╕рд╛рде рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдВрджрд░ рдХрд╣рд╛рдБ рд╕реЗ рдЖрддрд╛ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ, рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдирд╛рдорд╛рдВрдХрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░, рдПрдХрд░реА рд╕рдВрдЪрд╛рд▓рди рдФрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд░реЗрдлрд░реА рдФрд░ рдЖрдЙрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреМрд╢рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЕрдкрд╡рд╛рдж рдмреНрд▓реЙрдХ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ


рджреВрд╕рд░реА рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рдЯреНрд░рд╛рдпрд▓ / рдХреИрдЪ / рдЖрдЦрд┐рд░ / рдлреЙрд▓реНрдЯ рдлрдВрдХреНрд╢рдирд▓рд┐рдЯреА, рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ
рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлреЙрд▓реНрдЯ рдмреНрд▓реЙрдХ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рдпрд╣ C # рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ MSIL рдореЗрдВ рд╣реИред рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛
рдЕрдВрддрд┐рдо рдПрдирд╛рд▓реЙрдЧ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж "рд╣рд╛рдп" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрдирдкреБрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЕрднреНрдпрд╛рд╕ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред

var throwSmth = Expression.Throw(Expression.Constant(new Exception(), typeof(Exception)));
var log = Expression.Call(null, typeof(Console).GetMethod(nameof(Console.WriteLine), new[] { typeof(string) }), Expression.Constant("Hi", typeof(string)));
var read = Expression.Call(null, typeof(Console).GetMethod(nameof(Console.ReadLine)));
var fault = Expression.TryFault(throwSmth, Expression.Block(new[] { log, read }));
Expression<Action> expr = Expression.Lambda<Action>(fault);
Action compiledExpression = expr.Compile();
compiledExpression();

рдЙрдкрд▓рдмреНрдз рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡реГрдХреНрд╖ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг

рддрд╛рд▓рд┐рдХрд╛


рдПрдХ рдкреНрд░рдХрд╛рд░рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд░реНрдгрди
рдореБрдЦреНрдп
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, . ,
Expression<TDelegate>
BinaryExpression(+, тАФ )
UnaryExpression(+, -), throw
ConstantExpressionтАФ
ParameterExpression
MethodCallExpression, MethodInfo
IndexExpression
BlockExpression, .
ConditionalExpressionтАФ if-else
LabelTargetgoto
LabelExpression, . LabelTarget. , GotoExpression, тАФ . void, .
GotoExpression. . ( .. ┬лbreak┬╗)
LoopExpression, ┬лbreak┬╗
SwitchCaseSwitchExpression
SwitchExpressionswitch/case
TryExpressiontry/catch/finally/fault
CatchBlock, ,
ElementInitIEnumerable. ListInitExpression
ListInitExpression+
DefaultExpression
NewArrayExpression+
NewExpression
/
MemberAssignment
MemberBinding, , ,
MemberExpression/
MemberInitExpression
MemberListBinding/
MemberMemberBinding/ , /
LambdaExpression
InvocationExpression-
DebugInfoExpression.
SymbolDocumentInfo, .
DynamicExpression( )
RuntimeVariablesExpression/
TypeBinaryExpression, (is)



  • ExpressionVisitor тАФ . .
  • DynamicExpressionVisitor тАФ DynamicExpression ( VisitDynamic)


рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рддреБрд▓рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдореИрдВрдиреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдпрд╣ рд╕рдм рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХреА - рдХреЗрд╡рд▓ рдореВрд▓ рд╡рд╛рд▓реЗред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рдЕрдкрдиреЗ рднрдВрдбрд╛рд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА ред


рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди


рддреЛ, рдХрд╛рд░реНрдп рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реИред рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ: рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпреБрддреНрдкрдиреНрди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд┐рдпрдо рд╣реИрдВ - рдЧреБрдгрд╛, рднрд╛рдЧ, рдЖрджрд┐ред рдСрдкрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реВрддреНрд░ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕реВрддреНрд░реАрдп рд╕реВрддреНрд░реАрдХрд░рдг рдореЗрдВ, рдХрд╛рд░реНрдп рдХреЛ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдЪ / рдХреЗрд╕ рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдФрд░ рднрд╛рд╖рд╛ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдореЗрдВ рд╕реНрд╡рд┐рдЪ / рдХреЗрд╕ 2.0 рдпрд╛ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред

рдпрд╣рд╛рдБ рдХреБрдЫ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рдПрдХ рд╣рдм рдкрд░, рдЗрддрдиреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдмреЛрдЭрд┐рд▓ рдФрд░ рдЦрд░рд╛рдм рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЬреАрдердм рдХреЛ рджреЗрдЦреЗрдВ ред рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рдирд┐рдХрд▓рд╛:

рдЙрджрд╛рд╣рд░рдг
    public class PatterntMatchingDerivative
    {
        private readonly MethodInfo _pow = typeof(Math).GetMethod(nameof(Math.Pow));
        private readonly MethodInfo _log = typeof(Math).GetMethod(nameof(Math.Log), new[] { typeof(double) });
        private readonly ConstantExpression _zero = Expression.Constant(0d, typeof(double));
        private readonly ConstantExpression _one = Expression.Constant(1d, typeof(double));
		
        public Expression<Func<double, double>> ParseDerivative(Expression<Func<double, double>> function)
        {
            return Expression.Lambda<Func<double, double>>(ParseDerivative(function.Body), function.Parameters);
        }

        private Expression ParseDerivative(Expression function) => function switch
        {
            BinaryExpression binaryExpr => function.NodeType switch
            {
                ExpressionType.Add => Expression.Add(ParseDerivative(binaryExpr.Left), ParseDerivative(binaryExpr.Right)),
                ExpressionType.Subtract => Expression.Subtract(ParseDerivative(binaryExpr.Left), ParseDerivative(binaryExpr.Right)),

                ExpressionType.Multiply => (binaryExpr.Left, binaryExpr.Right) switch
		{	
	  	    (ConstantExpression _, ConstantExpression _) => _zero,
		    (ConstantExpression constant, ParameterExpression _) => constant,
		    (ParameterExpression _, ConstantExpression constant) => constant,
		    _ => Expression.Add(Expression.Multiply(ParseDerivative(binaryExpr.Left), binaryExpr.Right), Expression.Multiply(binaryExpr.Left, ParseDerivative(binaryExpr.Right)))
		},

                ExpressionType.Divide => (binaryExpr.Left, binaryExpr.Right) switch
		{
		    (ConstantExpression _, ConstantExpression _) => _zero,
		    (ConstantExpression constant, ParameterExpression parameter) => Expression.Divide(constant, Expression.Multiply(parameter, parameter)),
		    (ParameterExpression _, ConstantExpression constant) => Expression.Divide(_one, constant),
		    _ => Expression.Divide(Expression.Subtract(Expression.Multiply(ParseDerivative(binaryExpr.Left), binaryExpr.Right), Expression.Multiply(binaryExpr.Left, ParseDerivative(binaryExpr.Right))), Expression.Multiply(binaryExpr.Right, binaryExpr.Right))
	        },
            },
            MethodCallExpression methodCall when methodCall.Method == _pow => (methodCall.Arguments[0], methodCall.Arguments[1]) switch
            {
                (ConstantExpression constant, ParameterExpression _) => Expression.Multiply(methodCall, Expression.Call(null, _log, constant)),
                (ParameterExpression param, ConstantExpression constant) => Expression.Multiply(constant, Expression.Call(null, _pow, param, Expression.Constant((double)constant.Value - 1, typeof(double)))),
                (ConstantExpression constant, Expression expression) => Expression.Multiply(Expression.Multiply(ParseDerivative(expression), methodCall), Expression.Call(null, _log, constant)),
             },
             _ => function.NodeType switch
            {
                ExpressionType.Constant => _zero,
                ExpressionType.Parameter => _one,
                _ => throw new OutOfMemoryException("Bitmap best practice")
             }
        };
    }


рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдпрд╣ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реБрдИ - рд╕рднреА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рдлрд┐рдЯ рд╣реЛрддреА рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ рд╢рдмреНрджреЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддреЗред

рднреЛрд▓реЗ рдЖрдЧрдВрддреБрдХ


рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдореЗрдВ, рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЯреНрд░реА рдЖрдЧрдВрддреБрдХ рддреБрд░рдВрдд рдзреНрдпрд╛рди рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬреЛ
рдХрд┐ рд░рд╕реЛрдИ рдореЗрдВ рдлреБрд░реНрддреАрд▓реА рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реМрдХреАрдиреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╣реБрдд рд╢реЛрд░ рдФрд░ рдереЛрдбрд╝реА рд╕реА рдШрдмрд░рд╛рд╣рдЯ рдХрд░рддрд╛ рд╣реИред тАЬрдбрд░ рдЕрдЬреНрдЮрд╛рдирддрд╛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЧрд▓рдд рдЬреНрдЮрд╛рди рд╣реИред рдпрд╣ рд╕рдЪ рд╣реИ рдХрд┐ рдЬреЛ рд╕рдЪ рдирд╣реАрдВ рд╣реИ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЯреЙрд▓реНрд╕реНрдЯреЙрдп рдХреЗ рдЗрд╕ рдЕрджреНрднреБрдд рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП, рдЕрдЬреНрдЮрд╛рдирддрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдФрд░ Google рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд▓рд┐рдВрдХ 1949 рдореЗрдВ "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡реГрдХреНрд╖ рдЖрдЧрдВрддреБрдХ" рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ (рд╕рд╛рдЗрдмреЗрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж) рд╣реИред
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдЦ рдХрд╛ рд╢реАрд░реНрд╖рдХ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рдкреНрд░рддреНрдпрдп рдЖрдЧрдВрддреБрдХ рдХреЗ рд╕рд╛рде рдирд╛рдорд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ ред

рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛, рд▓реЗрдЦ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:
рдЬреАрдердм рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХред

рдЙрджрд╛рд╣рд░рдг
public class CustomDerivativeExpressionTreeVisitor
    {
        public Expression<Func<double, double>> Visit(Expression<Func<double, double>> function)
        {
            return Expression.Lambda<Func<double, double>>(Visitor.CreateFromExpression(function.Body).Visit(), function.Parameters);
        }
    }

    public abstract class Visitor
    {
        protected static readonly MethodInfo Pow = typeof(Math).GetMethod(nameof(Math.Pow));
        protected static readonly MethodInfo Log = typeof(Math).GetMethod(nameof(Math.Log), new[] { typeof(double) });
        protected readonly ConstantExpression Zero = Expression.Constant(0d, typeof(double));
        protected readonly ConstantExpression One = Expression.Constant(1d, typeof(double));
        public abstract Expression Visit();
        public static Visitor CreateFromExpression(Expression node)
            => node switch
            {
                BinaryExpression be => new BinaryVisitor(be),
                MethodCallExpression mce when mce.Method == Pow => new PowMethodCallVisitor(mce),
                _ => new SimpleVisitor(node),
            };
        
    }

    public class BinaryVisitor : Visitor
    {
        private readonly BinaryExpression _node;
        
        public BinaryVisitor(BinaryExpression node)
        {
            _node = node;
        }

        public override Expression Visit()
            => _node.NodeType switch
            {
                ExpressionType.Add => Expression.Add(ParseDerivative(binaryExpr.Left), ParseDerivative(binaryExpr.Right)),
                ExpressionType.Subtract => Expression.Subtract(ParseDerivative(binaryExpr.Left), ParseDerivative(binaryExpr.Right)),

                ExpressionType.Multiply => (binaryExpr.Left, binaryExpr.Right) switch
		{	
	  	    (ConstantExpression _, ConstantExpression _) => _zero,
		    (ConstantExpression constant, ParameterExpression _) => constant,
		    (ParameterExpression _, ConstantExpression constant) => constant,
		    _ => Expression.Add(Expression.Multiply(ParseDerivative(binaryExpr.Left), binaryExpr.Right), Expression.Multiply(binaryExpr.Left, ParseDerivative(binaryExpr.Right)))
		},

                ExpressionType.Divide => (binaryExpr.Left, binaryExpr.Right) switch
		{
		    (ConstantExpression _, ConstantExpression _) => _zero,
		    (ConstantExpression constant, ParameterExpression parameter) => Expression.Divide(constant, Expression.Multiply(parameter, parameter)),
		    (ParameterExpression _, ConstantExpression constant) => Expression.Divide(_one, constant),
		    _ => Expression.Divide(Expression.Subtract(Expression.Multiply(ParseDerivative(binaryExpr.Left), binaryExpr.Right), Expression.Multiply(binaryExpr.Left, ParseDerivative(binaryExpr.Right))), Expression.Multiply(binaryExpr.Right, binaryExpr.Right))
	        },
            };
    }

    public class PowMethodCallVisitor : Visitor
    {
        private readonly MethodCallExpression _node;

        public PowMethodCallVisitor(MethodCallExpression node)
        {
            _node = node;
        }

        public override Expression Visit()
            => (_node.Arguments[0], _node.Arguments[1]) switch
            {
                (ConstantExpression constant, ParameterExpression _) => Expression.Multiply(_node, Expression.Call(null, Log, constant)),
                (ParameterExpression param, ConstantExpression constant) => Expression.Multiply(constant, Expression.Call(null, Pow, param, Expression.Constant((double)constant.Value - 1, typeof(double)))),
                (ConstantExpression constant, Expression expression) => Expression.Multiply(Expression.Multiply(CreateFromExpression(expression).Visit(), _node), Expression.Call(null, Log, constant)),
            };
    }

    public class SimpleVisitor : Visitor
    {
        private readonly Expression _node;

        public SimpleVisitor(Expression node)
        {
            _node = node;
        }

        public override Expression Visit()
            => _node.NodeType switch
            {
                ExpressionType.Constant => Zero,
                ExpressionType.Parameter => One,
            };
    }


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдорд╛рдорд▓реЛрдВ рдХреЛ рдлреИрд▓рд╛рддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрдо рдирд╣реАрдВ рдереЗ, рдЬрд╛рджреВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджрд┐рдпрд╛ред рд╕рднреА рдПрдХ рд╣реА рдорд╛рдорд▓реЗ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВред рдФрд░ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбрдмрд▓ рдкреНрд░реЗрд╖рдг рдХрд╣рд╛рдВ рд╣реИ?

рдХреНрд▓рд╛рд╕рд┐рдХ рдЖрдЧрдВрддреБрдХ рдФрд░ рджреЛрд╣рд░реА рдкреНрд░реЗрд╖рдг


рдпрд╣рд╛рдБ рдпрд╣ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рд▓рд╛рдпрдХ рд╣реИ , рдпрд╣ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рднреА рд╣реИ , рдЬреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЯреНрд░реА рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХрд╛ рдЖрдзрд╛рд░ рд╣реИ ред рдЖрдЗрдП рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХрд░реЗрдВред

рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░, рдиреЛрдбреНрд╕ (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рдХрд╛рд░) рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддреЗ рд╣реИрдВред

рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдХреБрдЫ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реНрд╡рд┐рдЪ / рдХреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ред рдпрд╣ рдЗрддрдирд╛ рдмреБрд░рд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВ: рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рддрд░реНрдХ рдлреИрд▓рд╛рддреЗ рд╣реИрдВред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдмрд╣реБрд░реВрдкрддрд╛ рдФрд░ рдЖрднрд╛рд╕реА рдЪреБрдиреМрддрд┐рдпреЛрдВ ( рдЙрд░реНрдл рджреЗрд░ рд╕реЗ рдмрд╛рдзреНрдпрдХрд╛рд░реА) рд░рдирдЯрд╛рдЗрдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╢рд┐рдлреНрдЯ рдХрд░рдирд╛ рдФрд░ рдЗрди рдЪреЗрдХреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рд╕реЗ рд╣рдЯрд╛рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕рдм рдХреБрдЫ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдкредрд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рддрд░реНрдХ рдХреЛ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдореЗрдВ рдЖрднрд╛рд╕реА рдкрджреНрдзрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ, рд╣рдо рд╕реНрд╡рд┐рдЪ / рдХреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдкреЙрд▓рд┐рдореЙрд░реНрдлрд┐рдХ рдХреЙрд▓ рдХрд╛ рддрдВрддреНрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рддрдп рдХрд░реЗрдЧрд╛ред рдореЗрдердб рдЯреЗрдмрд▓ рдпрд╣рд╛рдБ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЗрд╕рдореЗрдВ рдСрдлрд╝рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдзрд┐рдпрд╛рдБ рдмрддрд╛рдИ рдЬрд╛рдПрдБрдЧреАред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдкреВрд░реЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИ, рддреЛ рдЪрд▓реЛ рджреВрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрднрд╛рд╕реА рддрд░реАрдХреЗ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡реЗ рдПрдХ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рд╣рдо GetDeriviative () рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдм рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрдХреНрд╖рд╛рдПрдВ рдЦреБрдж рдЕрдЬреАрдм рд▓рдЧрддреА рд╣реИрдВред рд╣рдо рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдРрд╕реЗ рддрд░реАрдХреЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХреЗ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИрдВред рдФрд░ рд╣рдордиреЗ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ (рдкрд░реНрдпрд╛рдкреНрдд рддрд░реАрдХреЗ рд╕реЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ)ред рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ,рд▓реЗрдХрд┐рди рдмрд╣реБрд░реВрдкрддрд╛ (рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ) рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдВред

рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдЕрд╕рд▓реА рдЖрдЧрдВрддреБрдХ рдЭреВрда рдмреЛрд▓рддрд╛ рд╣реИред рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐) рдореЗрдВ, рд╣рдо рдлреЙрд░реНрдо рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ

virtual Expression Accept(ExpressionVisitor visitor);

рд╡рд╛рд░рд┐рд╕реЛрдВ рдореЗрдВ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

ExpressionVisitor рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ
рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрднрд╛рд╕реА рдкрджреНрдзрддрд┐ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ ExpressionVisitor рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, VisitBinary (...), VisitMethodCall (...), VisitConstant (...), VisitParameter (...)ред

рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдЧ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрдиред рдмрд╛рдЗрдирд░реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

	
protected internal override Expression Accept(ExpressionVisitor visitor)
{
        return visitor.VisitBinary(this);
}

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ рдирдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЗрд╡рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рд╡рд┐рдЬрд┐рдЯрд░ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд░рд┐рд╕ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ DerivativeExpressionVisitor рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХреА рдХреБрдЫ рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреЛ рдЕрдЬреНрдЮрд╛рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВред
рд╣рдо рд╡рд░реНрдЪреБрдЕрд▓ рдПрдХреНрд╕реЗрдкреНрдЯ рдкрджреНрдзрддрд┐ рдХреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирд╡рд┐рдЬрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХрд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред DerivativeExpressionVisitor рдХреЗ рд╕рд╛рдеред рдбрд╛рдпрдиреЗрдорд┐рдХ рдбрд┐рд╕реНрдкреИрдЪрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕реНрд╡реАрдХрд╛рд░ рдХреА рдУрд╡рд░рд░рд╛рдЗрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд░рди-рдЯрд╛рдЗрдо, рдмрд╛рдЗрдирд░реАрдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдмрд╛рдЗрдирд░реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирд╡рд┐рд╕реЗрд╕рд░ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЬрдмрд╕реЗ VisitBinary рднреА рдЖрднрд╛рд╕реА рд╣реИ, рд╣рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдлрд┐рд░, рд╣рдо рдмрд╕ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдХреЙрд▓ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ (рд░рди рдЯрд╛рдЗрдо рдкрд░) рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдП рдЧрдП рд╡рд┐рдЬрд┐рдЯрдмрд┐рдирд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛрд╣рд░реЗ рдкреНрд░реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ - "рдЖрдк рдЗрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ" рдХреА рд╢реИрд▓реА рдореЗрдВ рдкрд┐рдВрдЧ-рдкреЛрдВрдЧ - "рдирд╣реАрдВ, рдЖрдк"ред

рдпрд╣ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдмрд╛рд╣рд░ рд╕реЗ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреЛ "рдЬреЛрдбрд╝рдирд╛" рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рдирд╣реАрдВ
рдХрдХреНрд╖рд╛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдбрд╛рдЙрдирд╕рд╛рдЗрдб рд╣реИрдВ:

  1. рд╕реНрд╡реАрдХрд╛рд░ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рд╡рд╛рдордкрдВрдереА, рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдм рдХреБрдЫ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ
  2. рдПрдХ рдЕрдЪреНрдЫреЗ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рддрд░рдВрдЧ рдкреНрд░рднрд╛рд╡ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд╛рд░рд┐рд╕ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рднреА рдХреЛ рдЕрдкрдиреЗ рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

рд▓реЗрдХрд┐рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреЗрдбрд╝ рдХреА рдкреНрд░рдХреГрддрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЗрди рд▓рд╛рдЧрддреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЙрдирдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
рдпрд╣рд╛рдВ рдЖрдк рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рддреЛ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдЕрдВрдд рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдЬреАрдердм рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг
public class BuildinExpressionTreeVisitor : ExpressionVisitor
    {
        private readonly MethodInfo _pow = typeof(Math).GetMethod(nameof(Math.Pow));
        private readonly MethodInfo _log = typeof(Math).GetMethod(nameof(Math.Log), new[] { typeof(double) });
        private readonly ConstantExpression _zero = Expression.Constant(0d, typeof(double));
        private readonly ConstantExpression _one = Expression.Constant(1d, typeof(double));

        public Expression<Func<double, double>> GetDerivative(Expression<Func<double, double>> function)
        {
            return Expression.Lambda<Func<double, double>>(Visit(function.Body), function.Parameters);
        }

        protected override Expression VisitBinary(BinaryExpression binaryExpr)
            => binaryExpr.NodeType switch
            {
                ExpressionType.Add => Expression.Add(Visit(binaryExpr.Left), Visit(binaryExpr.Right)),
                ExpressionType.Subtract => Expression.Subtract(Visit(binaryExpr.Left), Visit(binaryExpr.Right)),

                ExpressionType.Multiply when binaryExpr.Left is ConstantExpression && binaryExpr.Right is ConstantExpression => _zero,
                ExpressionType.Multiply when binaryExpr.Left is ConstantExpression && binaryExpr.Right is ParameterExpression => binaryExpr.Left,
                ExpressionType.Multiply when binaryExpr.Left is ParameterExpression && binaryExpr.Right is ConstantExpression => binaryExpr.Right,
                ExpressionType.Multiply => Expression.Add(Expression.Multiply(Visit(binaryExpr.Left), binaryExpr.Right), Expression.Multiply(binaryExpr.Left, Visit(binaryExpr.Right))),

                ExpressionType.Divide when binaryExpr.Left is ConstantExpression && binaryExpr.Right is ConstantExpression => _zero,
                ExpressionType.Divide when binaryExpr.Left is ConstantExpression && binaryExpr.Right is ParameterExpression => Expression.Divide(binaryExpr.Left, Expression.Multiply(binaryExpr.Right, binaryExpr.Right)),
                ExpressionType.Divide when binaryExpr.Left is ParameterExpression && binaryExpr.Right is ConstantExpression => Expression.Divide(_one, binaryExpr.Right),
                ExpressionType.Divide => Expression.Divide(Expression.Subtract(Expression.Multiply(Visit(binaryExpr.Left), binaryExpr.Right), Expression.Multiply(binaryExpr.Left, Visit(binaryExpr.Right))), Expression.Multiply(binaryExpr.Right, binaryExpr.Right)),
            };

        protected override Expression VisitMethodCall(MethodCallExpression methodCall)
            => (methodCall.Arguments[0], methodCall.Arguments[1]) switch
            {
                (ConstantExpression constant, ParameterExpression _) => Expression.Multiply(methodCall, Expression.Call(null, _log, constant)),
                (ParameterExpression param, ConstantExpression constant) => Expression.Multiply(constant, Expression.Call(null, _pow, param, Expression.Constant((double)constant.Value - 1, typeof(double)))),
                (ConstantExpression constant, Expression expression) => Expression.Multiply(Expression.Multiply(Visit(expression), methodCall), Expression.Call(null, _log, constant)),
            };

        protected override Expression VisitConstant(ConstantExpression _) => _zero;

        protected override Expression VisitParameter(ParameterExpression b) => _one;
    }


рдЬрд╛рдБрдЪ - рдкрд░рд┐рдгрд╛рдо


рд╢рд╛рдпрдж, рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЙрддреНрддрд░ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдкрд╕рдВрдж рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдФрджреНрдпреЛрдЧрд┐рдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдпрджрд┐ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд░реВрдк рд╕реЗ рдмрдврд╝ рдЬрд╛рдПрдЧреА, рддреЛ рдпрд╣ рдЖрдЧрдВрддреБрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рднреЛрд▓реЗ рдЖрдЧрдВрддреБрдХ рдХреЛ рднреА рдЬреАрд╡рди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ - рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдмрд┐рдЦреЗрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдпрджрд┐ рдкрджрд╛рдиреБрдХреНрд░рдо рдиреЗ рдЕрдкрдиреА рдУрд░ рд╕реЗ рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХреА рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рднреА рдЕрдкрд╡рд╛рдж рд╣реИрдВред

рдЗрд╕реА рддрд░рд╣, рдкрджрд╛рдиреБрдХреНрд░рдо рд╕реЗ рдЖрдЧрдВрддреБрдХ рдХрд╛ рд╕рдорд░реНрдерди рдмрд╣реБрдд рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реИред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рджреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

Source: https://habr.com/ru/post/undefined/


All Articles