内联显示方法可用于快速检查

时间:2012-02-08 22:23:45

标签: c# extension-methods

通常,在调查我正在开发的一些代码时,我会在这里或那里抛出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()

我的问题是,.NET中是否有类似Disp的方法?有没有更好的方法来实施Disp?这种技术有缺点吗?

更新2012-02-09

我还添加了一个接受格式字符串的重载版本:

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

2 个答案:

答案 0 :(得分:2)

我没有看到它的问题,尽管您可能会考虑使用Action<T>参数使其更通用:

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

这类似于Ruby中的Tap

您可以使用<{1}}方法代替Dump方法:

a.().b().Tap(Console.WriteLine).c()

答案 1 :(得分:1)

LINQPad以这种方式使用Dump扩展方法。

唯一的缺点是所有扩展方法都很常见:

  1. 扩展方法是静态的,这限制了您在覆盖其行为方面的灵活性。
  2. 任何“使用”扩展方法命名空间的文件都会在每个对象上看到此方法。智能感知变得混乱,你冒着命名冲突的风险。