#c# #.net-core
Вопрос:
У меня есть следующие функции:
public static async Task<MyReturnType> MyFunction(Func<MyReturnType> func)
{
// do stuff
while (/* some conditions */)
{
var myReturn = func();
// do stuff
}
// do stuff
}
public static async Task<MyReturnType> MyFunction(Func<Task<MyReturnType>> func)
{
// do stuff
while (/* some conditions */)
{
var myReturn = await func();
// do stuff
}
// do stuff
}
Как вы можете видеть, эти 2 функции идентичны, за исключением того, что переданная функция вызывается по-разному. Есть ли способ объединить эти 2 функции в 1, чтобы мне не приходилось дублировать другой код?
Ответ №1:
Вы можете полностью удалить первую перегрузку и всякий раз, когда захотите вызвать первую перегрузку, например
await MyFunction(() => new MyReturnType());
Вы можете использовать Task.FromResult
для обертывания MyReturnType
в Task<MyReturnTask>
:
await MyFunction(() => Task.FromResult(new MyReturnType()));
FromResult
дает вам выполненную задачу, поэтому await func()
не делает никакого ожидания и оценивает результат синхронно, аналогично тому, что происходит при первой перегрузке.
Хотя я бы предпочел сохранить первую перегрузку и вызвать вторую перегрузку:
public static Task<MyReturnType> MyFunction(Func<MyReturnType> func)
=> MyFunction(() => Task.FromResult(func()))