#c# #generics #func
#c# #общие положения #функция
Вопрос:
У меня есть следующий метод, и мне интересно узнать о влиянии компиляции выражения на производительность.
public async Task<Response<TResult>> Execute<TApi, TResult>(Expression<Func<TApi, Task<TResult>>> executeApiMethod)
{
try
{
var responseData = await executeApiMethod.Compile()(restApi).ConfigureAwait(false);
return new Response<TResult>(responseData);
}
catch (ApiException refitApiException)
{
throw;
}
}
Есть ли способ лучше? Есть ли какое-либо влияние на производительность compile()
, поскольку это является общим и может вызываться с разными аргументами каждый раз, когда выполняется компиляция, является неполадкой.
Комментарии:
1. Я бы ожидал, что это, по крайней мере частично, будет зависеть от выражений, которые вы компилируете. Вполне разумно опасаться этого, но правильным следующим шагом будет измерить влияние на производительность. Мы недостаточно знаем о вашем приложении, чтобы знать, что было бы разумно, а что было бы слишком высоким, или есть ли возможности кэширования и т.д.
2. @JonSkeet мой вариант использования — перенос вызовов api для обработки ситуаций с ошибками. ie:
clienthandler.execute(a=>a.GetSomething(), myApiContract)
чтобы мне не приходилось везде повторять один и тот же код.3. Почему вы используете для этого деревья выражений вместо обычного делегата? (Я предполагаю, что ваш код обработки ошибок на самом деле более сложный — просто перехват и повторное перемещение бессмысленны.)
4. @JonSkeet Я удалил код для краткости. Вы имеете в виду, что я должен использовать Func вместо Expression?
5. Ну, это, конечно, выглядит так, как будто вы могли бы просто использовать
Func
, да.