Встроенный метод отображения полезен для быстрого осмотра - PullRequest
3 голосов
/ 09 февраля 2012

Часто, исследуя какой-то код, который я разрабатываю, я добавляю Console.WriteLine здесь или там, чтобы увидеть значение при запуске программы.Недостаток Console.WriteLine заключается в том, что мне нужно заключить выражение в скобки и, возможно, разбить его на части.Например, учитывая это выражение:

a().b().c();

давайте предположим, что я хочу напечатать значение b().Мне нужно сделать что-то вроде:

var val = a().b();

Console.WriteLine(val);

val.c();

Это много редактирования, просто чтобы увидеть значение.

Мое решение было использовать этот метод расширения:

public static T Disp<T>(this T obj)
{
    Console.WriteLine(obj);
    return obj;
}

Я могу ввести вызов Disp в любой цепочке методов без изменения значения общего выражения.Чтобы увидеть результат b() в приведенном выше примере, я бы сделал:

a.().b().Disp().c()

Мой вопрос: есть ли уже какой-нибудь метод, например Disp в .NET?Есть ли лучший способ реализовать Disp?Есть ли недостатки у этой техники?

обновление 2012-02-09

Я также добавил перегруженную версию, которая принимает строку формата:

public static T Disp<T>(this T obj, string format)
{
    Console.WriteLine(string.Format(format, obj));
    return obj;
}

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Я не вижу проблем с этим, хотя вы можете рассмотреть возможность сделать его более общим с параметром Action<T>:

public static T Tap<T>(this T obj, Action<T> act)
{
    act(obj);
    return obj;
}

Это похоже на Tap в Ruby.

Вместо вашего Dump метода вы можете сделать:

a.().b().Tap(Console.WriteLine).c()
1 голос
/ 09 февраля 2012

LINQPad использует метод расширения Dump точно таким же образом.

Единственные недостатки являются общими для всех методов расширения:

  1. Методы расширения являются статическими, что ограничивает вашу гибкость с точки зрения переопределения их поведения.
  2. Любой файл, который "использует" пространство имен метода расширения, увидит этот метод на каждом объекте. Intellisense запутывается, и вы рискуете назвать коллизии.
...