Задачи на лайв-кодинг: что выведет код, рефакторинг, написать эндпоинт
↑ 9.2 Финальная подготовка: проекты, live coding, вопросы · ← Предыдущая · → Следующая
Зачем это на собесе
Три типовых формата: «что выведет код», «найдите проблемы и отрефакторите», «напишите эндпоинт».
1. Что выведет код
// Задача 1
var list = new List<int> { 1, 2, 3 };
IEnumerable<int> q = list.Where(x => x > 1);
list.Add(4);
Console.WriteLine(string.Join(",", q));Ответ
2,3,4— LINQ отложенный: запрос выполняется при переборе, уже после добавления4.
// Задача 2
var actions = new List<Action>();
for (int i = 0; i < 3; i++) actions.Add(() => Console.Write(i));
foreach (var a in actions) a();Ответ
333— замыкание захватывает переменнуюi, а не значение; после циклаi = 3. Вforeachпеременная цикла своя на итерацию, поэтому там был бы012.
// Задача 3
async Task<int> Work() { await Task.Delay(100); return 1; }
var t = Work();
Console.WriteLine("A");
Console.WriteLine(await t);
Console.WriteLine("B");Ответ
A,1,B: задача стартует сразу, ноawait tждёт результат.
// Задача 4
string s = "a"; object o = s; s += "b";
Console.WriteLine(o == (object)"a");Ответ
True:oпо-прежнему ссылается на исходную строку"a"(строки неизменяемы), а литералы интернируются.
2. Найдите проблемы и отрефакторите
public class OrderService
{
public List<Order> GetOrders(string customer)
{
var db = new SqlConnection("Server=...;Password=123");
db.Open();
var cmd = new SqlCommand("select * from orders where customer='" + customer + "'", db);
var reader = cmd.ExecuteReader();
var res = new List<Order>();
while (reader.Read()) res.Add(new Order { Id = (int)reader[0] });
return res;
}
}Проблемы и исправление
- SQL-инъекция → параметры.
- Строка подключения с паролем в коде → конфигурация и секреты.
- Соединение, команда и reader не освобождаются →
using/await using.- Синхронный ввод-вывод →
asyncсCancellationToken.select *и индексы колонок → явный список, маппинг по имени (Dapper).- Создание соединения внутри метода и
newбез DI → внедрятьNpgsqlDataSource/репозиторий.- Нет пагинации → ограничение выборки.
public async Task<List<OrderDto>> GetOrdersAsync(string customer, CancellationToken ct)
{
await using var conn = await dataSource.OpenConnectionAsync(ct);
return (await conn.QueryAsync<OrderDto>(
new CommandDefinition("select id, number, total from orders where customer = @customer order by id limit 100", new { customer }, cancellationToken: ct))).ToList();
}3. Напишите эндпоинт
Условие: POST /orders принимает { customerId, items: [{ sku, qty }] }, создаёт заказ, возвращает 201 и Location; валидирует вход, не создаёт заказ дважды при повторе запроса.
app.MapPost("/orders", async (CreateOrderRequest req, HttpContext http, IValidator<CreateOrderRequest> validator,
IOrderService orders, CancellationToken ct) =>
{
var v = await validator.ValidateAsync(req, ct);
if (!v.IsValid) return Results.ValidationProblem(v.ToDictionary());
var key = http.Request.Headers["Idempotency-Key"].ToString();
if (string.IsNullOrEmpty(key)) return Results.Problem("Idempotency-Key required", statusCode: 400);
var result = await orders.CreateAsync(req, key, ct); // внутри: unique(key) + транзакция
return result switch
{
{ IsDuplicate: true } => Results.Ok(result.Order), // повтор: тот же результат
_ => Results.Created($"/orders/{result.Order.Id}", result.Order),
};
}).RequireAuthorization();Что обсудить: авторизация и проверка владельца, транзакция, идемпотентность, события (outbox), тесты, коды ошибок, лимиты.
Связанные темы
- [[be-9-2-5-chastye-voprosy-csharp-i-dotnet|Частые вопросы C# и .NET: блиц]]
- Вопросы работодателю и переговоры о зарплате