Информация об изменениях

Сообщение Re: Отладка многострочных функциональных конструкций от 06.04.2023 15:14

Изменено 06.04.2023 15:20 IT

Re: Отладка многострочных функциональных конструкций
Здравствуйте, merge, Вы писали:

M>Часто попадаю в коде на такие длинные конструкции


Из данного примера не понятно, что это: linq to objects или что-то типа EF/linq2db. Если второе, то отлаживать нужно не отдельные методы выражения, а смотреть какой генерируется SQL и отлаживать уже его. Если же это linq to object и вот прямо совсем совсем без отладки ну никак, то нормальный ремесленник/мастеровой всегда может смастерить себе какую-нибудь приспособу на коленке. Возьмём к примеру метод GroupBy, нам понадобится его сигнатура, далее пишем по ней следующий конвертик:

namespace DebuggableEnumerable
{
#if !DEBUG
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
#endif
    public static IEnumerable<IGrouping<TKey,TSource>> DebugGroupBy<TSource, TKey>(
      this IEnumerable<TSource> source,
      Func<TSource, TKey> keySelector)
    {
#if DEBUG
        var before = source.ToList();
        var after  = source.GroupBy(keySelector).ToList();
        return after;
#else
        return source.GroupBy(keySelector);
#endif
    }
}


Далее в своём выражении меняем GroupBy на DebugGroupBy и дебажим вволю.

Но это если совсем припекло. В Enumerable методов очень много и сразу покрыть всё вряд ли появится желание.
Re: Отладка многострочных функциональных конструкций
Здравствуйте, merge, Вы писали:

M>Часто попадаю в коде на такие длинные конструкции


Из данного примера не понятно, что это: linq to objects или что-то типа EF/linq2db. Если второе, то отлаживать нужно не отдельные методы выражения, а смотреть какой генерируется SQL и отлаживать уже его. Если же это linq to object и вот прямо совсем совсем без отладки ну никак, то нормальный ремесленник/мастеровой всегда может смастерить себе какую-нибудь приспособу на коленке. Возьмём к примеру метод GroupBy, нам понадобится его сигнатура, далее пишем по ней следующий конвертик:

static class DebuggableEnumerable
{
#if !DEBUG
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
#endif
    public static IEnumerable<IGrouping<TKey,TSource>> DebugGroupBy<TSource, TKey>(
      this IEnumerable<TSource> source,
      Func<TSource, TKey> keySelector)
    {
#if DEBUG
        var before = source.ToList();
        var after  = source.GroupBy(keySelector).ToList();
        return after;
#else
        return source.GroupBy(keySelector);
#endif
    }
}


Далее в своём выражении меняем GroupBy на DebugGroupBy и дебажим вволю.

Но это если совсем припекло. В Enumerable методов очень много и сразу покрыть всё вряд ли появится желание.